web-dev-qa-db-fra.com

Comment puis-je mesurer le temps d'exécution de la méthode en Java?

J'ai un programme que j'ai moi-même écrit en Java, mais je veux tester les temps d'exécution des méthodes et obtenir des timings pour des méthodes spécifiques. Je me demandais si c'était possible, peut-être avec un plug-in Eclipse? ou peut-être insérer du code?

Je vois, c’est un programme assez petit, rien d’autre que 1500 lignes, qui serait mieux un outil dédié ou System.currentTimeMillis()?

Merci beaucoup

40
KP65

Outre l'utilisation d'un profileur, un moyen simple d'obtenir ce que vous voulez est le suivant:

public class SomeClass{
   public void somePublicMethod()
   {
       long startTime = System.currentTimeMillis();
       someMethodWhichYouWantToProfile();
       long endTime = System.currentTimeMillis();
       System.out.println("Total execution time: " + (endTime-startTime) + "ms"); 
   }
 }
41
Chris Knight

Si le goulot d'étranglement est suffisamment important pour être observé avec un profileur, utilisez un profileur. 

Si vous avez besoin de plus de précision, le meilleur moyen de mesurer un petit morceau de code est d'utiliser un cadre de référence microbench Java tel que JMH d'OpenJDK ou Caliper de Google . Je pense qu'ils sont aussi simples à utiliser que JUnit et non seulement vous obtiendrez des résultats plus précis, mais vous obtiendrez l'expertise de la communauté pour le faire correctement. 

Suit un micro-repère JMH pour mesurer le temps d'exécution de Math.log():

private double x = Math.PI;

@Benchmark
public void myBenchmark() {
    return Math.log(x)
}

L'utilisation de currentMillis() et nanoTime() pour mesurer présente de nombreuses limitations:

  1. Ils ont une latence (ils prennent aussi du temps à s’exécuter), ce qui biaise vos mesures.
  2. Ils ont une précision limitée de VERY, cela signifie que vous pouvez mesurer des choses de 26ns à 26ns sous Linux et environ 300 sous Windows a décrit ici
  3. La phase d'échauffement n'est pas prise en compte, ce qui fait que vos mesures fluctuent BEAUCOUP.

Les méthodes currentMillis() et nanoTime() en Java peuvent être utiles, mais doivent être utilisées avec EXTREME CAUTION, sinon vous pouvez obtenir des erreurs de mesure erronées comme ceci où l'ordre des extraits mesurés influence les mesures ou comme ceci où l'auteur conclut à tort que plusieurs millions d'opérations ont été effectuées en moins d'une ms, alors qu'en réalité, la JMV n'a réalisé aucune opération et a hissé le code, sans exécuter aucun code.

Voici une merveilleuse vidéo expliquant comment microréférencer la bonne façon: https://shipilev.net/#benchmarking

19
El Marce

Vous devriez utiliser un profileur comme

Ils s'intégreront facilement à tout IDE et afficheront tous les détails dont vous avez besoin.

Bien sûr, ces outils sont complexes et destinés à être utilisés pour profiler des programmes complexes. Si vous avez besoin de quelques points de repère simples, je vous suggère d'utiliser System.currentTimeMillis() ou System.nanoTime() et de calculer le delta en millisecs entre vos appels.

3
Jack

L'utilisation d'un profileur est préférable car vous pouvez connaître les temps d'exécution moyens et les goulots d'étranglement dans votre application. 

J'utilise VisualVM . lisse et simple. 

3
Midhat

Google Guava a un chronomètre , rend les choses simples et faciles.

Stopwatch stopwatch = Stopwatch.createStarted();
myFunctionCall();
LOGGER.debug("Time taken by myFunctionCall: " + stopwatch.stop());
3
zengr

Pour les tests de mesure de temps rapides et sales, n’utilisez pas l’horloge murale ( System.currentTimeMillis() ). Préférez System.nanoTime() à la place:

public static void main(String... ignored) throws InterruptedException {
    final long then = System.nanoTime();
    TimeUnit.SECONDS.sleep(1);
    final long millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - then);
    System.out.println("Slept for (ms): " + millis); // = something around 1000.
}
3
Martin Andersson

Jprofiler et yourkit sont bons, mais coûtent de l'argent.

Il existe un plugin gratuit pour eclispe appelé TPTP (plate-forme d’outils de test et de performance) qui peut vous donner les temps d’exécution du code. Voici un tutoriel qu'une recherche rapide sur Google a mis en place. http://www.Eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html

1
thattmatt

Vous pouvez ajouter ce code et il vous dira combien de temps la méthode a pris pour s'exécuter. 

long millisecondsStart = System.currentTimeMillis();
executeMethod();
long timeSpentInMilliseconds = System.currentTimeMillis() - millisecondsStart;
0
Shervin Asgari

Une autre solution sur mesure pourrait être basée sur le post suivant: http://www.mkyong.com/spring/spring-aop-examples-advice/

Vous avez également la possibilité d'utiliser les utilitaires autour de l'application monitoring & snmp. Si vous devez régulièrement "synchroniser" vos méthodes dans un environnement de production, vous devriez probablement envisager d'utiliser l'un de ces outils SNMP.

0
user2991363