2009-04-08 4 views

Répondre

16

L'idiome classique est:

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

il est possible que dès que vous obtenez votre startTime, votre thread perd le contrôle et met du temps à revenir. –

+0

Attendez-vous qu'il écrit sur le disque lorsqu'il est bloqué? ce qui compte habituellement dans le temps de mur, y compris le blocage. –

5

pas testé, mais quelque chose comme:

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

Je suis nouveau à Java. Pourquoi avez-vous utilisé un bloc try combiné avec finaly? :) –

+0

Le bloc try ... finally garantit que le delta est calculé même si une exception est levée pendant la partie de travail réelle. Ce qui peut ou peut ne pas vous être utile. –

+2

Je voudrais suggérer une prise et gérer l'exception. Votre temps ne signifie rien si l'opération ne s'est pas terminée comme prévu. – uriDium

2

Il y a un exemple de code ici:

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

Le façon Je ferais cela est juste courir en boucle un certain nombre de fois. Comme si vous l'exécutez 1000 fois et l'horloge, cela vous donne des millisecondes. Exécutez-le 1 000 000 fois, et cela vous donne des microsecondes.

Si vous voulez également savoir pourquoi cela prend tant de temps, vous pouvez le mettre en pause un certain nombre de fois (comme 10) pendant qu'il fonctionne, et cela vous dira ce qu'il fait et pourquoi.

1

Le problème avec la méthode get System.xxx est que la méthode elle-même a besoin de quelques millisecondes pour être calculée. La manière généralement "acceptée" de le faire est de faire le test quelques dizaines de milliers de fois et de calculer une moyenne de ceci.

En outre, en fonction de votre système d'exploitation, il existe un élément appelé time granularity (exemple pour Windows). C'est le temps le plus court que votre OS peut calculer. Sur certains OS c'est une milliseconde, sur d'autres c'est une nanoseconde. Cela pourrait ou non être pertinent dans votre cas.

+0

System.nanoTime() prend 0,5 microsecondes et System.currentTimeMillis() est beaucoup moins. –

Questions connexes