2009-04-08 9 views

Respuesta

16

El lenguaje estándar es:

long startTime = System.nanoTime(); 
doSomething(); 
long elapsedTime = System.nanoTime() - startTime; 
+0

es posible que tan pronto como llegue su hora de inicio, su hilo pierda el control y demore un tiempo en volver. –

+0

¿Espera que escriba en el disco cuando está bloqueado? lo que generalmente importa en el tiempo de la pared, incluido el bloqueo. –

5

no probados, sino algo así como:

long delta = System.nanoTime(); 
try { 
    // do your stuff 
} finally { 
    delta = System.nanoTime() - delta; 
} 
+0

Soy nuevo en Java. ¿Por qué usaste un bloque de prueba combinado con finalmente? :) –

+0

El bloque try ... finally asegura que el delta se calcula incluso si se lanza una excepción durante la parte de trabajo real. Que puede o no serle útil. –

+2

Sugeriría una captura y manejaría la excepción. Su tiempo no significa nada si la operación no se completó como se esperaba. – uriDium

2

Hay un ejemplo de código aquí:

http://www.goldb.org/stopwatchjava.html

/* 
    Copyright (c) 2005, Corey Goldberg 

    StopWatch.java is free software; you can redistribute it and/or modify 
    it under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 2 of the License, or 
    (at your option) any later version. 
*/ 


public class StopWatch { 

    private long startTime = 0; 
    private long stopTime = 0; 
    private boolean running = false; 


    public void start() { 
     this.startTime = System.currentTimeMillis(); 
     this.running = true; 
    } 


    public void stop() { 
     this.stopTime = System.currentTimeMillis(); 
     this.running = false; 
    } 


    //elaspsed time in milliseconds 
    public long getElapsedTime() { 
     long elapsed; 
     if (running) { 
      elapsed = (System.currentTimeMillis() - startTime); 
     } 
     else { 
      elapsed = (stopTime - startTime); 
     } 
     return elapsed; 
    } 


    //elaspsed time in seconds 
    public long getElapsedTimeSecs() { 
     long elapsed; 
     if (running) { 
      elapsed = ((System.currentTimeMillis() - startTime)/1000); 
     } 
     else { 
      elapsed = ((stopTime - startTime)/1000); 
     } 
     return elapsed; 
    } 




    //sample usage 
    public static void main(String[] args) { 
     StopWatch s = new StopWatch(); 
     s.start(); 
     //code you want to time goes here 
     s.stop(); 
     System.out.println("elapsed time in milliseconds: " + s.getElapsedTime()); 
    } 
} 
2

El camino Yo haría eso solo ejecutarlo varias veces. Como si lo ejecutaras 1000 veces y lo controlaras, eso te da milisegundos. Ejecútelo 1,000,000 de veces, y le da microsegundos.

Si también quiere saber por qué está tomando tanto tiempo, puede pausarlo varias veces (como 10) mientras se está ejecutando, y eso le dirá lo que está haciendo y por qué.

1

El problema con el método get System.xxx es que el método en sí necesita unos pocos milisegundos para computarse. La forma generalmente "aceptada" de hacerlo es ejecutar la prueba algunas decenas de miles de veces y calcular un promedio de esto.

Además, dependiendo de su sistema operativo, hay algo llamado time granularity (ejemplo para Windows). Esta es la menor cantidad de tiempo que su sistema operativo puede calcular. En algunos sistemas operativos es un milisegundo, en algunos otros es un nanosegundo. Puede o no ser relevante en tu caso.

+0

System.nanoTime() tarda 0.5 microsegundos y System.currentTimeMillis() es mucho menos. –

Cuestiones relacionadas