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.
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.
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
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 .
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;
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.):
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.
System.currentTimeMillis()
.
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.
System.nanoTime()
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]
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");
}
}
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.