88 votes

Combien de temps le programme Java de la vitesse d'exécution

Désolé si cela sonne comme une question stupide, mais comment faites-vous le temps de l'exécution d'un programme java? Je ne suis pas sûr de ce que la classe que je devrais utiliser pour ce faire.

Je suis plutôt à la recherche de quelque chose comme:

//Some timer starts here
for (int i = 0; i < length; i++) {
  // Do something
}
//End timer here

System.out.println("Total execution time: " + totalExecutionTime);

Merci

141voto

bua Points 2673
final long startTime = System.currentTimeMillis();
for (int i = 0; i < length; i++) {
  // Do something
}
final long endTime = System.currentTimeMillis();

System.out.println("Total execution time: " + (endTime - startTime) );

Espérons que cela a aidé.

36voto

rhu Points 611

Sachez qu'il existe certains problèmes où l' System#nanoTime() ne peut pas être utilisé de manière fiable sur les CPU multi-coeurs pour enregistrer le temps écoulé ... chaque cœur dispose de dispose de son propre TSC (Time Stamp Counter): ce compteur est utilisé pour obtenir des nano-temps (c'est vraiment le nombre de tiques puisque le PROCESSEUR démarré).

Donc, à moins que le système d'exploitation n'certains TSC temps la déformation de garder le noyau de la synchronisation, puis, si un fil est prévue sur une base lorsque le temps initial de la lecture est prise, puis passer à une autre base, le temps relatif peut sporadiquement semblent sauter vers l'arrière et vers l'avant.

J'ai remarqué cela il y a quelques temps sur AMD/Solaris où le temps écoulé entre deux points de chronométrages ont parfois, en revenant comme des valeurs négatives ou de façon inattendue de grands nombres positifs. Il y avait un patch du noyau Solaris et d'un paramètre du BIOS tenu de la force la technologie AMD PowerNow! hors, ce qui semble résolu.

Aussi, il n'y a (à ma connaissance) une mesure non fixées bug lors de l'utilisation de java System#nanoTime() dans une VirtualBox environnement; à l'origine de toutes sortes de bizarre intermittent problèmes de threading pour nous autant de l' java.util.concurrency se repose sur les nano temps.

Voir aussi:

http://stackoverflow.com/questions/510462/is-system-nanotime-completely-useless http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html

9voto

BalusC Points 498232

Vous pouvez faire usage de System#nanoTime(). Avant et après l'exécution, et il suffit de faire le calcul. Il est préféré au-dessus de System#currentTimeMillis() parce qu'il a une meilleure précision. En fonction du matériel et de la plate-forme utilisée, vous pourriez obtenir une mauvaise écart dans le temps écoulé. Ici avec Core2Duo sur Windows, entre environ 0 et ~15ms en fait rien ne peut être calculé.

Un outil plus sophistiqué est un profiler.

9voto

Jonathan Feinberg Points 24791

Vous obtenez le système actuel, en temps, en millisecondes:

final long startTime = System.currentTimeMillis();

Alors vous faites ce que vous allez faire:

for (int i = 0; i < length; i++) {
  // Do something
}

Ensuite, vous voyez combien de temps il a fallu:

final long elapsedTimeMillis = System.currentTimeMillis() - startTime;

3voto

SyntaxT3rr0r Points 10771

Pour des choses simples, du Système.currentTimeMillis() peut fonctionner.

C'est en fait tellement courante que mon IDE est de l'installation de sorte que lors de la saisie des "t0" il me génère la ligne suivante:

final long t0 = System.currentTimeMillis()

Mais pour compliquer les choses, vous voudrez probablement utiliser des mesures de temps, comme ici (faites défiler vers le bas un peu et regarder les mesures de temps exprimée y compris les écarts-types, etc.):

http://perf4j.codehaus.org/devguide.html

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