Em Java, existem algumas formas de medir o tempo de execução de um trecho do código sem o uso de bibliotecas externas ou ferramentas de profiling. O jeito mais convencional é utilizar o System.currentTimeMillis():
long startTime = System.currentTimeMillis(); metodoDemorado(); long totalTime = System.currentTimeMillis() - startTime;
Pode-se substituir o currentTimeMillis() por nanoTime(). A diferença dos dois está que o currentTimeMillis utiliza o relógio da máquina para pegar a quantidade de millisegundos desde às 00hs do dia 01 de Janeiro de 1970 UTC até o momento atual. Já o nanoTime() não é baseado em relógio e usa o timer mais preciso que exista na máquina e por isso só pode ser utilizado para medida de tempo de execução e não relacionado com o relógio da máquina.
long startTime = System.nanoTime(); metodoDemorado(); long totalTime = System.nanoTime() - startTime;
Maiores informações nesse link.
Agora o mais legal que eu estou utilizando atualmente é a nova API (java.time) do Java 8, principalmente as classes Instant e Duration. O código é mais legível e tem mais funcionalidade para trabalhar com a duração (Duration) que é retornada entre um momento ou instante (Instant) e outro. Uma observação, o tempo não é tão preciso, normalmente é interessante quando precisão de segundos é suficiente.
Instant startTime = Instant.now(); metodoDemorado(); Instant endTime = Instant.now(); Duration totalTime = Duration.between(startTime, endTime);
Agora, para quem vai trabalhar com bechmarking de várias threads e não o tempo que o sistema fica aguardando o método ser executado é interessante utilizar medidas como User Time e System Time. Para isso existe o ThreadMXBean que recupera dados direto da JVM, mas esse assunto é tópico para um outro post.
Maneiras de medir o tempo em Java sem bibliotecas externas: Em Java, existem algumas formas... http://t.co/Yn6C6NPOlH (via @thiagovespa)