Como cronometrar a velocidade de execução do programa Java

desculpe se isso soa como uma pergunta idiota, mas como você cronometra a execução de um programa java? Não sei que Classe devo usar para fazer isto.

Estou à procura de algo como:
//Some timer starts here
for (int i = 0; i < length; i++) {
  // Do something
}
//End timer here

System.out.println("Total execution time: " + totalExecutionTime);
Obrigado.
 68
Author: George Mic, 2010-04-04

11 answers

final long startTime = System.currentTimeMillis();
for (int i = 0; i < length; i++) {
  // Do something
}
final long endTime = System.currentTimeMillis();

System.out.println("Total execution time: " + (endTime - startTime) );
Espero que isto tenha ajudado.
 114
Author: bua, 2012-12-06 09:55:24

Esteja ciente de que existem alguns problemas em que {[[0]} não pode ser usado de forma fiável em CPU multi-core para registar o tempo decorrido ... cada núcleo tem o seu próprio TSC (contador de tempo ): Este contador é usado para obter o tempo nano (realmente é o número de carrapatos desde o arranque da CPU).

Por isso, a não ser que o SO faça alguma deformação no tempo do TSC para manter os núcleos em sincronia, então se um tópico for agendado para um núcleo quando a leitura de tempo inicial for tomada, então muda para um núcleo diferente, o tempo relativo pode esporadicamente parecer Saltar para trás e para a frente.

Eu observei isto há algum tempo atrás em AMD / Solaris onde os tempos passados entre dois pontos de tempo estavam por vezes a voltar como valores negativos ou números positivos inesperadamente grandes. Havia um remendo do kernel Solaris e uma configuração BIOS necessários para forçar o AMD PowerNow! desligado, o que parecia resolvê-lo.

Também existe (AFAIK) um bug até agora não fixo ao usar java System#nanoTime() em um Ambiente VirtualBox; causando todos os tipos de bizarros problemas intermitentes de rosca para nós, tanto o pacote java.util.concurrency depende do tempo nano.

Ver também:

É O Sistema.nanoTime () completamente inútil? http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html

 30
Author: rhu, 2017-05-23 10:30:55

Podes fazer uso de System#nanoTime(). Apanha-o antes e depois da execução e faz as contas. É preferido acima System#currentTimeMillis() porque tem uma precisão melhor. Dependendo do hardware e da plataforma utilizada, você pode obter uma lacuna incorreta no tempo decorrido. Aqui, com o Core2Duo no Windows, entre cerca de 0 e ~15ms na verdade, nada pode ser calculado.

Uma ferramenta mais avançada é um profiler .

 7
Author: BalusC, 2010-04-03 22:33:19

Tens o tempo actual do sistema, em milisegundos:

final long startTime = System.currentTimeMillis();
Então faz o que vais fazer.
for (int i = 0; i < length; i++) {
  // Do something
}

Depois vês quanto tempo demorou:

final long elapsedTimeMillis = System.currentTimeMillis() - startTime;
 6
Author: Jonathan Feinberg, 2010-04-03 22:28:25

Para coisas simples, Sistema.currentTimeMillis () pode funcionar.

{[[2]} é tão comum que a minha IDE seja configurada de modo que ao entrar em " t0 " me gera a seguinte linha:
final long t0 = System.currentTimeMillis()

Mas para coisas mais complicadas, você provavelmente vai querer usar medições estatísticas de tempo, como aqui(descer um pouco e olhar para as medições de tempo expressas, incluindo desvios padrão etc.):

Http://perf4j.codehaus.org/devguide.html

 3
Author: SyntaxT3rr0r, 2010-04-04 01:23:43

Utilizando AOP/AspectJ e @Loggable anotação de jcabi-aspects {[6] } Você pode fazer isso fácil e compacto:

@Loggable(Loggable.DEBUG)
public String getSomeResult() {
  // return some value
}

Todas as chamadas para este método serão enviadas para as instalações de Registo SLF4J com DEBUG Nível de Registo. E cada mensagem de log incluirá o tempo de execução.

 2
Author: yegor256, 2015-01-19 08:39:17
Olha para isto.System.currentTimeMillis().
 1
Author: Thomas, 2010-04-03 22:29:02

Utilizar long startTime=System.currentTimeMillis() para a hora de início, no topo do ciclo

Põe long endTime= System.currentTimeMillis(); fora do fim do ciclo. Você terá que subtrair os valores para obter o tempo de execução em milisegundos.

Se quer Tempo em nanossegundos, confira.System.nanoTime()
 1
Author: Jason, 2015-10-28 19:14:04

Você também pode tentar o Perf4J. é uma maneira legal de fazer o que você está procurando, e ajuda em estatísticas de desempenho agregadas como média, mínimo, máximo, desvio padrão e transações por segundo ao longo de um período de tempo definido. Um extracto de http://perf4j.codehaus.org/devguide.html:

StopWatch stopWatch = new LoggingStopWatch();

try {
    // the code block being timed - this is just a dummy example
    long sleepTime = (long)(Math.random() * 1000L);
    Thread.sleep(sleepTime);
    if (sleepTime > 500L) {
        throw new Exception("Throwing exception");
    }

    stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms");
} catch (Exception e) {
    stopWatch.stop("codeBlock2.failure", "Exception was: " + e);
}

Resultado:

INFO: start[1230493236109] time[447] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493236719] time[567] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493237286] time[986] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493238273] time[194] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238467] time[463] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238930] time[310] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239241] time[610] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493239852] time[84] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239937] time[30] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239968] time[852] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
 0
Author: dotrc, 2013-04-19 08:40:53
public class someClass
{
   public static void main(String[] args) // your app start point
   {
       long start = java.util.Calendar.getInstance().getTimeInMillis();

       ... your stuff ...

       long end = java.util.Calendar.getInstance().getTimeInMillis();
       System.out.println("it took this long to complete this stuff: " + (end - start) + "ms");
   }
}
 0
Author: luis.espinal, 2014-02-09 20:18:49

Usando O Sistema.currentTimeMillis() é a maneira correta de fazer isso. Mas, se você usar a linha de comando, e quiser cronometrar todo o programa aproximadamente e rapidamente, pense em:

time java App

O que lhe permite não modificar o código e cronometrar a aplicação.

 0
Author: MarAja, 2014-12-29 15:42:55