313 votes

Mesurer le temps d'exécution d'une méthode Java

Comment calculer le temps d'exécution d'une méthode en Java ?

1 votes

Lol, cela fait beaucoup de doublons :D dommage que lorsque vous fermez une question, vous ne pouvez en nommer qu'une seule :(

1 votes

Voici une classe de chronomètre pour java. Le format de sortie du temps est identique à celui de la classe Stopwatch de .NET. carlosqt.blogspot.com/2011/05/stopwatch-class-for-java.html

0 votes

Vous avez oublié de mentionner explicitement l'objectif de la mesure, qui pourrait avoir une influence sur la manière dont elle doit être effectuée. Quoi qu'il en soit, il semble que vous souhaitiez optimiser les performances. Dans ce cas, vous devriez absolument vous renseigner sur le "Micro Benchmarking". Bien que l'approche System.nanoTime() soit assez simple, il n'existe pas de moyen facile de mesurer exactement les performances d'un programme, car elles dépendent d'un grand nombre de facteurs différents (par exemple, le matériel, les autres logiciels fonctionnant sur le même système, la compilation juste-à-temps et à chaud, les données d'entrée, etc.)

302voto

Vitalii Fedorenko Points 17469

Pour être plus précis, j'utiliserais nanoTime() plutôt que currentTimeMillis() :

long startTime = System.nanoTime();
myCall(); 
long stopTime = System.nanoTime();
System.out.println(stopTime - startTime);

En Java 8 (le format de sortie est ISO-8601) :

Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end)); // prints PT1M3.553S

Goyave Chronomètre :

Stopwatch stopwatch = Stopwatch.createStarted();
myCall();
stopwatch.stop(); // optional
System.out.println("Time elapsed: "+ stopwatch.elapsed(TimeUnit.MILLISECONDS));

18 votes

Vous pourriez vouloir mettre en forme le résultat. Le temps en nanosecondes pour tout ce qui est valable va avoir beaucoup de chiffres.

0 votes

Merci @Vitalii Fedorenko. est-ce que cela va être exact si la méthode implique beaucoup de transactions de la base de données ?

0 votes

Je ne vois pas pourquoi le nombre de transactions de la base de données devrait affecter la précision, la seule chose à garder à l'esprit est que le temps de la requête de la base de données sera inclus dans le temps d'exécution total.

251voto

bakkal Points 13449

Vous pouvez prendre des instantanés de l'horodatage avant et après, puis répéter les expériences plusieurs fois pour obtenir des résultats moyens . Il existe également des profileurs qui peuvent le faire pour vous.


Extrait de "Java Platform Performance : Strategies and Tactics" :

Avec System.currentTimeMillis()

class TimeTest1 {
   public static void main(String[] args) {

      long startTime = System.currentTimeMillis();

      long total = 0;
      for (int i = 0; i < 10000000; i++) {
         total += i;
      }

      long stopTime = System.currentTimeMillis();
      long elapsedTime = stopTime - startTime;
      System.out.println(elapsedTime);
   }
}

Avec une classe StopWatch

Vous pouvez utiliser ce StopWatch et appeler start() et stop avant et après la méthode.

class TimeTest2 {
   public static void main(String[] args) {

      Stopwatch timer = new Stopwatch().start();

      long total = 0;
      for (int i = 0; i < 10000000; i++) {
         total += i;
      }

      timer.stop();
      System.out.println(timer.getElapsedTime());
   }
}

Voir ici (archivé).


NetBeans Profiler :

Application Performance Application

Profils de performance CPU au niveau de la méthode (temps d'exécution) . Vous pouvez choisir de profiler l'ensemble de application ou une partie de l'application l'application.

Voir ici .

4 votes

currentTimeMillis plutôt que nanoTime . Vous ne voulez probablement pas que le timer cod ein la méthode testée. Pour avoir une idée du temps de chauffe et de la variation entre les résultats, j'ai tendance à mettre une boucle externe pour répéter le chronométrage cinq fois.

6 votes

+1 pour souligner que vous devez répéter les tests

2 votes

N'est-ce pas contraire à une plateforme multithread ? Comment peut-on en être sûr ? Je pense que l'utilisation d'un profileur sera une meilleure approche ici.

51voto

Regarde ça : System.currentTimeMillis .

Avec cela, vous pouvez calculer le temps de votre méthode en faisant :

long start = System.currentTimeMillis();
class.method();
long time = System.currentTimeMillis() - start;

0 votes

J'ai juste besoin du temps pris pour l'exécution d'une méthode particulière dans un programme java.

6 votes

Il est préférable d'utiliser System.nanoTime(), qui est plus précis.

2 votes

@Renuka : la réponse de fonctionnel ne fournit-elle pas ce que vous recherchez ?

31voto

JJD Points 7539

Si vous développez des applications pour Android vous devriez essayer le TimingLogger classe.
Jetez un coup d'œil à ces articles qui décrivent l'utilisation de l'outil de gestion de l'environnement. TimingLogger classe d'aide :

0 votes

Android a mis au point des utilitaires comme timeLogger et Textutils Merci de me le signaler :)

0 votes

@JJD existe-t-il un profileur pour cela au lieu d'utiliser cette classe ?

0 votes

Android Studio dispose d'un profil CPU intégré qui vous permet de voir combien de temps certains processus ont pris. Je ne suis pas sûr que ce soit ce que vous recherchez.

15voto

duffymo Points 188155

Vous pouvez penser à la programmation orientée aspect. Vous ne voulez pas encombrer votre code de timings. Vous voulez être en mesure de les activer et de les désactiver de manière déclarative.

Si vous utilisez Spring, jetez un coup d'oeil à leur Intercepteur de méthodes classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X