Cronometrar uma função

13 respostas
rodrigo.achilles

Olá pessoal,
Estou fazendo um estudo de complexidade de algoritimos.
Estou querendo saber como faço para ligar um relógio e desligá-lo assim que a função acabar seu trabalho.

Em C, faço assim, eu já testei e está funcionando, agora em Java estou me enrolando um pouco:

clock_t start, end;
 double cpu_time_used;
 
 start = clock();
 
  ... /* A função */
 
 end = clock();
 cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;

Alguém me ajuda. Por Favor! :frowning:

13 Respostas

furetz

Se vc soh quiser saber qnto tempo demora, o que vc pode fazer, acho que é mais simples, é no inicio da função colocar:

long inicio = System.currentTimeMillis();

e qndo acabar vc pode fazer:

long fim = System.currentTimeMillis() - inicio;

Aí vc tem no fim o tempo em ms.

pcalcado

Você pdoe utilizar System e pegar os milissegundos quando o método inicia e quando ele termina, subtraindo e tal.

Se for mais de um método ou quiser medir um sistema grande, considere AOP.

[]s

rodrigo.achilles

Valeu galera, funcionou.
Eu estava fazendo com o método getTime().
Mais me retornava o mesmo tempo no final.

Obrigadão.
Abraços :lol:

T

Se milissegundos não são suficientes para você, e se você está usando o Java 5.0, você pode usar System.nanoTime().
Desvantagens -
a) Embora System.nanoTime lhe retorne um valor em nanossegundos (bilionésimos de segundos!), na prática o valor cronometrado depende do hardware e do sistema operacional (que normalmente não consegue medir um tempo inferior a 1 ms). OK, ok, eu sei que o Pentium III e IV conseguem medir um tempo que é 1 clock (ou seja, para um Pentium IV 3.8 GHz isso seria 0,2632 ns) mas não sei se o sistema operacional acessa esse contador do Pentium III e IV.
b) Se com System.currentTimeMillis você tem de repetir o seu teste várias vezes e tirar uma média, porque por vários motivos (JIT compilation, garbage collection, memory swapping, disk caching, deoptimization etc) o tempo nunca se repete, imagine com System.nanoTime.

danieldestro

thingol, to cada vez mais impressionado com você, cara. O que você não sabe? Nas 24 horas do dia, você faz algo fora estudar?

rodrigo.achilles

Entendi thingol,

Boa explicação, valeu, mesmo dependendo dessas coisas todas, eu consegui com o Milisegundos, vou usar o nanosegundos e ver o que vai dar.

Abraços

louds

Se for mais de uma função, use um profiler que os resultados vão ser bem mais precisos. java -Xprof ou java -Xrunhprof já quebram um galho legal.

_fs

Se estiver usando Java 1.4, pode baixar o J3D e utilizar a classe Timer
http://javadesktop.org/java3d/javadoc/1.3.2-beta2/com/sun/j3d/utils/timer/J3DTimer.html

louds

Lipe, olhei essa classe e me veio uma dúvida enorme.

Lá fala que o método não é thread-safe, ate ai tudo bem. Mas o método não ser reentrante, ai fiquei bolado.

Desde quando java tem problemas de reentrancia para métodos que não chamam outros diretamente? Ou alguem seria estúpido o suficiente para usar JNI em um signal handler?

rodrigo.achilles

Valeu galera por tudo.

Eu estou usando o Java 1.5
Mas com o System.nanoTime() eu consigo numa boa e consigo ter essa precisão, embora, dependa do hardware, entre outros. Pois maior precisão seria se eu só tivesse rodando apenas esse processo.

Mas só pra comparar duas funções está ótimo.

Valeu mesmo! :smiley:

louds

Para aumentar a precisão não esqueça de usar -Xcomp e -Xbatch

rodrigo.achilles

Valeu louds, vou colocar!

Abraços e obrigado!

klarq

E para aplicações web?

Será que o tomcat tem essa medição?

Criado 1 de março de 2005
Ultima resposta 6 de abr. de 2006
Respostas 13
Participantes 8