- Comment obtenir le temps d'exécution d'une méthode?
- Existe-t-il une
Timer
classe d'utilité pour des choses comme le chronométrage de la durée d'une tâche, etc.?
La plupart des recherches sur Google renvoient des résultats pour les minuteries qui planifient les threads et les tâches, ce qui n'est pas ce que je veux.
java
timing
execution-time
Psaume Ogre33
la source
la source
Instant
classe: stackoverflow.com/a/30975902/1216775Réponses:
Il y a toujours la méthode à l'ancienne:
la source
Je pars avec la réponse simple. Travaille pour moi.
Cela fonctionne plutôt bien. La résolution n'est évidemment qu'à la milliseconde, vous pouvez faire mieux avec System.nanoTime (). Il y a quelques limitations aux deux (tranches de planification du système d'exploitation, etc.) mais cela fonctionne plutôt bien.
Moyenne sur quelques courses (le plus sera le mieux) et vous aurez une idée décente.
la source
nanoTime
est garanti au moins aussi résolu quecurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
est qu'il s'agit d'un horodatage réel, et pourrait également être utilisé pour enregistrer les heures de début / fin, alors quenanoTime
"ne peut être utilisé que pour mesurer le temps écoulé et n'est lié à aucune autre notion de système ou d'horloge murale. . "Allez les gars! Personne n'a mentionné la manière Guava de faire cela (ce qui est sans doute génial):
La bonne chose est que Stopwatch.toString () fait un bon travail de sélection des unités de temps pour la mesure. C'est-à-dire que si la valeur est petite, elle produira 38 ns, si elle est longue, elle affichera 5m 3s
Encore plus agréable:
Remarque: Google Guava nécessite Java 1.6+
la source
start()
plusieurs fois de suite (pareil pourstop()
).En utilisant Instant et Duration à partir de la nouvelle API de Java 8,
les sorties,
la source
Duration.between(start, end).getSeconds()
.Duration
a également des méthodes pour convertir en d'autres unités de temps, par exempletoMillis()
qui convertit en millisecondes.Rassemblé toutes les façons possibles en un seul endroit.
Date
Système. currentTimeMillis ()
Format lisible par l'homme
Goyave: Google Stopwatch JAR «Le chronomètre a pour objet de mesurer le temps écoulé en nanosecondes.
Apache Commons Lang JAR « StopWatch fournit une API pratique pour les timings.
JODA -TIME
API Java date time de Java 8 «Un objet Duration représente une période de temps entre deux objets Instant .
Spring Framework fournit laclasse utilitaire StopWatch pour mesurer le temps écoulé en Java.
Production:
la source
Utilisez un profileur (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, etc.). Vous obtiendrez les résultats les plus précis et le moins intrusif. Ils utilisent le mécanisme JVM intégré pour le profilage qui peut également vous fournir des informations supplémentaires telles que les traces de pile, les chemins d'exécution et des résultats plus complets si nécessaire.
Lorsque vous utilisez un profileur entièrement intégré, il n'est pas facile de profiler une méthode. Clic droit, Profiler -> Ajouter aux méthodes racine. Exécutez ensuite le profileur comme si vous faisiez un test ou un débogueur.
la source
Ce n'est probablement pas ce que vous vouliez que je dise, mais c'est une bonne utilisation d'AOP. Fouettez un intercepteur proxy autour de votre méthode et faites le timing.
Le quoi, pourquoi et comment de l'AOP dépasse malheureusement la portée de cette réponse, mais c'est comme ça que je le ferais probablement.
Edit: Voici un lien vers Spring AOP pour vous aider à démarrer, si vous le souhaitez. Il s'agit de l'implémentation la plus accessible d'AOP rencontrée par Iive pour Java.
De plus, étant donné les suggestions très simples de tout le monde, je dois ajouter que l'AOP est pour quand vous ne voulez pas que des choses comme le timing envahissent votre code. Mais dans de nombreux cas, ce type d'approche simple et facile convient.
la source
System.currentTimeMillis();
N'EST PAS une bonne approche pour mesurer les performances de vos algorithmes. Il mesure le temps total que vous vivez en tant qu'utilisateur regardant l'écran de l'ordinateur. Il inclut également le temps consommé par tout le reste exécuté sur votre ordinateur en arrière-plan. Cela pourrait faire une énorme différence si vous avez beaucoup de programmes en cours d'exécution sur votre poste de travail.L'approche appropriée consiste à utiliser le
java.lang.management
package.Depuis le site http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking :
getCpuTime()
méthode vous donne la somme de ceux-ci:la source
Avec Java 8, vous pouvez également faire quelque chose comme ça avec toutes les méthodes normales :
avec TimeIt comme:
Avec cette méthode, vous pouvez facilement mesurer le temps n'importe où dans votre code sans le casser. Dans cet exemple simple, j'imprime simplement l'heure. Pouvez-vous ajouter un commutateur pour TimeIt, par exemple pour imprimer uniquement l'heure dans DebugMode ou quelque chose.
Si vous travaillez avec Function, vous pouvez faire quelque chose comme ceci:
la source
Nous pouvons également utiliser la classe StopWatch de communs Apache pour mesurer le temps.
Exemple de code
la source
Juste une petite torsion, si vous n'utilisez pas d'outillage et que vous souhaitez chronométrer des méthodes avec un temps d'exécution faible: exécutez-le plusieurs fois, chaque fois en doublant le nombre d'exécutions jusqu'à ce que vous atteigniez une seconde environ. Ainsi, l'heure de l'appel à System.nanoTime et ainsi de suite, ni la précision de System.nanoTime n'affecte beaucoup le résultat.
Bien sûr, les mises en garde sur l' utilisation de l'horloge murale appliquent: influences de JIT-compilation, plusieurs threads / processus , etc. Ainsi, vous devez d'abord exécuter la méthode beaucoup de temps d' abord, de telle sorte que le compilateur JIT fait son travail, puis répétez ce test plusieurs fois et prenez le temps d'exécution le plus bas.
la source
Nous utilisons à cet effet des annotations AspectJ et Java. Si nous avons besoin de connaître le temps d'exécution d'une méthode, nous l'annotons simplement. Une version plus avancée pourrait utiliser un niveau de journal propre qui peut être activé et désactivé au moment de l'exécution.
la source
JEP 230: Microbenchmark Suite
Pour info, JEP 230: Microbenchmark Suite est un projet OpenJDK pour:
Cette fonctionnalité est arrivée dans Java 12 .
Harnais Java Microbenchmark (JMH)
Pour les versions antérieures de Java, jetez un œil au projet Java Microbenchmark Harness (JMH) sur lequel JEP 230 est basé.
la source
Vraiment un bon code.
http://www.rgagnon.com/javadetails/java-0585.html
la source
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Vous pouvez utiliser Perf4j . Utilitaire très cool. L'utilisation est simple
Plus d'informations peuvent être trouvées dans le Guide du développeurEdit: Le projet semble mort
la source
la source
Je fais essentiellement des variations de cela, mais compte tenu du fonctionnement de la compilation des points d'accès, si vous voulez obtenir des résultats précis, vous devez jeter les premières mesures et vous assurer que vous utilisez la méthode dans une application du monde réel (lire l'application spécifique).
Si le JIT décide de le compiler, vos chiffres varieront considérablement. alors soyez conscient
la source
En utilisant AOP / AspectJ et l'
@Loggable
annotation de jcabi-aspects, vous pouvez le faire facilement et compact:Chaque appel à cette méthode sera envoyé à l'installation de consignation SLF4J avec
DEBUG
niveau de consignation. Et chaque message de journal inclura le temps d'exécution.la source
Spring fournit une classe utilitaire org.springframework.util.StopWatch , selon JavaDoc:
Usage:
Production:
Avec Aspects:
la source
J'ai écrit une méthode pour imprimer le temps d'exécution de la méthode sous une forme très lisible. Par exemple, pour calculer la factorielle de 1 million, cela prend environ 9 minutes. Ainsi, le temps d'exécution est imprimé comme:
Le code est ici:
la source
Il y a plusieurs façons de procéder. Je reviens normalement à utiliser simplement quelque chose comme ça:
ou la même chose avec System.nanoTime ();
Pour quelque chose de plus sur le côté de l'analyse comparative, il semble également y avoir celui-ci: http://jetm.void.fm/ Je n'ai jamais essayé cependant.
la source
Vous pouvez utiliser la bibliothèque de métriques qui fournit divers instruments de mesure. Ajouter une dépendance:
Et configurez-le pour votre environnement.
Les méthodes peuvent être annotées avec @Timed :
ou un morceau de code enveloppé avec Timer :
Les métriques agrégées peuvent être exportées vers la console, JMX, CSV ou autre.
@Timed
exemple de sortie de mesures:la source
Si vous voulez une horloge murale
la source
Comme l'a dit "skaffman", utilisez AOP OU vous pouvez utiliser le tissage de bytecode d'exécution, tout comme les outils de couverture de méthode de test unitaire utilisent pour ajouter de manière transparente des informations de synchronisation aux méthodes invoquées.
Vous pouvez consulter le code utilisé par les outils open source comme Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). L'autre outil de couverture open source est http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Si vous parvenez finalement à faire ce que vous avez prévu, veuillez. partagez-le avec la communauté ici avec vos tâches / pots de fourmis.
la source
la source
J'ai modifié le code de la bonne réponse pour obtenir le résultat en quelques secondes:
la source
Vous pouvez utiliser la classe chronomètre du projet Spring Core:
Code:
Documentation pour le chronomètre: chronomètre simple, permettant de chronométrer un certain nombre de tâches, exposant le temps d'exécution total et le temps d'exécution pour chaque tâche nommée. Dissimule l'utilisation de System.currentTimeMillis (), améliorant la lisibilité du code d'application et réduisant la probabilité d'erreurs de calcul. Notez que cet objet n'est pas conçu pour être thread-safe et n'utilise pas la synchronisation. Cette classe est normalement utilisée pour vérifier les performances lors de la validation de concepts et lors du développement, plutôt que dans le cadre d'applications de production.
la source
Vous pouvez essayer de cette façon si vous voulez juste connaître l'heure.
la source
Ok, c'est une classe simple à utiliser pour un simple timing simple de vos fonctions. Il y a un exemple en dessous.
Exemple d'utilisation:
Exemple de sortie de console:
la source
Dans Java 8, une nouvelle classe nommée
Instant
est introduite. Selon doc:Cela peut être utilisé comme:
Il imprime
PT7.001S
.la source