Cronometrar uma função

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:

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.

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

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

Obrigadão.
Abraços :lol:

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.

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?

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

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.

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

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?

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:

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

Valeu louds, vou colocar!

Abraços e obrigado!

E para aplicações web?

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