web-dev-qa-db-fra.com

Comment puis-je compter le temps qu'il faut à une fonction pour exécuter Java?

J'ai besoin de mesurer le temps qu'il faut pour qu'une fonction soit complète en Java. Comment puis je faire ça?

Remarque:

Je veux mesurer la consommation de temps de function , et non celle du programme complet.

48
fmsf
long start = System.nanoTime();    
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
86
Ande TURNER

Voici comment calculer le temps écoulé.

// Get current time
long start = System.currentTimeMillis();

// Do something ...

// Get elapsed time in milliseconds
long elapsedTimeMillis = System.currentTimeMillis()-start;

// Get elapsed time in seconds
float elapsedTimeSec = elapsedTimeMillis/1000F;

// Get elapsed time in minutes
float elapsedTimeMin = elapsedTimeMillis/(60*1000F);

// Get elapsed time in hours
float elapsedTimeHour = elapsedTimeMillis/(60*60*1000F);

// Get elapsed time in days
float elapsedTimeDay = elapsedTimeMillis/(24*60*60*1000F);
42

Si vous utilisez Guava, envisagez d’utiliser Stopwatch , par exemple:

final Stopwatch sw = Stopwatch.createStarted();
methodToBeTimed();
final long elapsedMillis = sw.elapsed(TimeUnit.MILLISECONDS);
8
Jonathan
8
Aaron Maenpaa

Le profileur est la bonne réponse si vous avez plusieurs fonctions.

Un autre problème que je vois avec toutes les suggestions données jusqu'à présent est qu'elles fonctionnent bien pour une seule fonction, mais votre code sera parsemé d'éléments de synchronisation que vous ne pouvez pas désactiver.

Si vous savez faire de la programmation orientée aspect, c’est un bon moyen de conserver le code de chronométrage au même endroit et de l’appliquer de manière déclarative. Si vous utilisez quelque chose comme Log4J pour générer les valeurs, vous aurez la possibilité de l'activer ou de l'activer. C'est le profileur d'un homme pauvre.

Jetez un coup d'œil à AspectJ ou AOP de Spring.

6
duffymo

Tous les extraits de code ci-dessus mesurent le temps approximatif écoulé depuis le moment où la méthode a été invoquée jusqu'au moment où la méthode renvoie/lève une exception. De telles techniques ne traitent pas de la planification des threads, des pauses dues au GC, etc.

Oui, certains profileurs feront un travail raisonnable.

Si vous utilisez Java 1.6 et les versions ultérieures, vous pouvez utiliser le support de gestion et de surveillance VM basé sur JMX. Par exemple, vous pouvez trouver ThreadMXBean.getCurrentThreadCpuTime () of value. Le calcul de la différence de cette valeur avant et après l'invocation de la méthode vous donnera:

"... temps total de la CPU pour le thread actuel en nanosecondes. La valeur renvoyée correspond à une précision de nanosecondes, mais pas nécessairement à une précision de nanosecondes. Si la mise en œuvre fait la distinction entre le temps du mode utilisateur et le temps du mode système, que le thread actuel a été exécuté en mode utilisateur ou en mode système. " 

Si votre méthode génère des threads de travail, votre calcul devra être beaucoup plus élaboré ;-)

En général, je recommande de fouiller dans le paquet Java.lang.mangement .

5
Dilum Ranatunga

System.nanoTime doit être utilisé pour mesurer avec précision le delta entre deux fois pour les micro-repères.

public class CountTime {

  private static void walk() {
    for (int i = 0; i < Integer.MAX_VALUE; i++)
      ;
  }

  public static void main(String[] args) {
    long t0 = System.nanoTime();
    walk();
    long t1 = System.nanoTime();
    System.out.println("Elapsed time =" + (t1 - t0)
        + " nanoseconds");
  }

}

System.currentTimeMillis retourne l'heure actuelle en millisecondes. Vous pouvez l'utiliser pour obtenir l'heure actuelle. Cela peut être utile sur des machines virtuelles plus anciennes ou pour des processus plus longs.

3
McDowell

Utilisez soit System.currentTimeMillis () ou System.nanoTime ():

int someMethod() {
    long tm = System.nanoTime();
    try {
        ...
    } finally {
        tm = System.nanoTime()-tm;
        System.out.println("time spent in someMethod(): " + tm + "ns");
    }
}
3
Maurice Perry

ce chronomètre analogique est une autre option pour nous aussi ........ Consultez Java2s.com ici.

0
gumuruh