- Wie erhalte ich die Ausführungszeit einer Methode?
- Gibt es eine
Timer
Utility-Klasse für Dinge wie das Timing, wie lange eine Aufgabe dauert usw.?
Die meisten Suchanfragen bei Google geben Ergebnisse für Timer zurück, die Threads und Aufgaben planen, was ich nicht möchte.
java
timing
execution-time
Oger Psalm33
quelle
quelle
Instant
Klasse: stackoverflow.com/a/30975902/1216775Antworten:
Es gibt immer den altmodischen Weg:
quelle
Ich gehe mit der einfachen Antwort. Funktioniert bei mir.
Es funktioniert ganz gut. Die Auflösung ist offensichtlich nur auf die Millisekunde genau, Sie können es mit System.nanoTime () besser machen. Es gibt einige Einschränkungen für beide (Zeitplanpläne des Betriebssystems usw.), aber dies funktioniert ziemlich gut.
Durchschnitt über ein paar Läufe (je mehr desto besser) und Sie erhalten eine anständige Vorstellung.
quelle
nanoTime
ist garantiert mindestens so entschlossen wiecurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
ist, dass es sich um einen tatsächlichen Zeitstempel handelt und auch zum Protokollieren von Start- / Endzeiten verwendet werden kann, währendnanoTime
"nur zum Messen der verstrichenen Zeit verwendet werden kann und nicht mit einem anderen Begriff der System- oder Wanduhrzeit zusammenhängt . "Komm schon Leute! Niemand erwähnte die Guave- Methode, um das zu tun (was wohl großartig ist):
Das Schöne ist, dass Stopwatch.toString () die Zeiteinheiten für die Messung gut auswählt. Das heißt, wenn der Wert klein ist, werden 38 ns ausgegeben, wenn er lang ist, werden 5 m 3 s angezeigt
Noch schöner:
Hinweis: Für Google Guava ist Java 1.6+ erforderlich
quelle
start()
mehrmals hintereinander anrufen (dasselbe gilt fürstop()
).Verwenden von Instant und Duration aus der neuen API von Java 8,
Ausgänge,
quelle
Duration.between(start, end).getSeconds()
.Duration
hat auch Methoden zum Konvertieren in andere Zeiteinheiten, z. B.toMillis()
die in Millisekunden konvertieren.Sammelte alle möglichen Wege zusammen an einem Ort.
Datum
System. currentTimeMillis ()
Vom Menschen lesbares Format
Guave: Google Stopwatch JAR «Ein Ziel von Stopwatch ist es, die verstrichene Zeit in Nanosekunden zu messen.
Apache Commons Lang JAR « StopWatch bietet eine praktische API für Timings.
JODA- ZEIT
Java-Datums- / Uhrzeit-API von Java 8 «Ein Duration- Objekt repräsentiert einen Zeitraum zwischen zwei Instant- Objekten.
Spring Framework bietet die StopWatch- Dienstprogrammklasse zum Messen der verstrichenen Zeit in Java.
Ausgabe:
quelle
Verwenden Sie einen Profiler (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler usw.). Sie erhalten die genauesten Ergebnisse und sind am wenigsten aufdringlich. Sie verwenden den integrierten JVM-Mechanismus für die Profilerstellung, der Ihnen bei Bedarf zusätzliche Informationen wie Stapelspuren, Ausführungspfade und umfassendere Ergebnisse liefert.
Wenn Sie einen vollständig integrierten Profiler verwenden, ist es nicht einfach, eine Methode zu profilieren. Klicken Sie mit der rechten Maustaste auf Profiler -> Zu Stammmethoden hinzufügen. Führen Sie dann den Profiler so aus, als würden Sie einen Testlauf oder einen Debugger durchführen.
quelle
Dies ist wahrscheinlich nicht das, was Sie von mir wollten, aber dies ist eine gute Verwendung von AOP. Peitsche einen Proxy-Interceptor um deine Methode und mache das Timing dort.
Das Was, Warum und Wie von AOP würde leider den Rahmen dieser Antwort sprengen, aber so würde ich es wahrscheinlich tun.
Bearbeiten: Hier ist ein Link zu Spring AOP, um Ihnen den Einstieg zu erleichtern, wenn Sie daran interessiert sind. Dies ist die am leichtesten zugängliche Implementierung von AOP, die Iive für Java findet.
Angesichts der sehr einfachen Vorschläge aller anderen sollte ich hinzufügen, dass AOP für den Fall gedacht ist, dass Sie nicht möchten, dass Dinge wie das Timing in Ihren Code eindringen. Aber in vielen Fällen ist diese Art von einfachem und leichtem Ansatz in Ordnung.
quelle
System.currentTimeMillis();
IST KEIN guter Ansatz, um die Leistung Ihrer Algorithmen zu messen. Es misst die Gesamtzeit, die Sie als Benutzer auf dem Computerbildschirm verbringen. Es enthält auch Zeit, die von allem anderen verbraucht wird, das im Hintergrund auf Ihrem Computer ausgeführt wird. Dies kann einen großen Unterschied machen, wenn auf Ihrer Workstation viele Programme ausgeführt werden.Der richtige Ansatz ist die Verwendung eines
java.lang.management
Pakets.Von der Website http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking :
getCpuTime()
Methode gibt Ihnen die Summe dieser:quelle
Mit Java 8 können Sie auch so etwas mit allen normalen Methoden machen :
mit TimeIt like:
Mit dieser Methode können Sie überall in Ihrem Code einfach Zeit messen, ohne ihn zu beschädigen. In diesem einfachen Beispiel drucke ich einfach die Zeit. Mögen Sie einen Schalter für TimeIt hinzufügen, z. B. um nur die Zeit im DebugMode oder so etwas zu drucken.
Wenn Sie mit Function arbeiten , können Sie Folgendes tun:
quelle
Wir können auch die StopWatch-Klasse von Apache Commons verwenden, um die Zeit zu messen.
Beispielcode
quelle
Nur eine kleine Wendung, wenn Sie keine Werkzeuge verwenden und Methoden mit geringer Ausführungszeit zeitlich festlegen möchten: Führen Sie sie mehrmals aus, wobei Sie die Anzahl der Ausführungen jedes Mal verdoppeln, bis Sie eine Sekunde oder so erreichen. Daher hat weder die Zeit des Aufrufs von System.nanoTime usw. noch die Genauigkeit von System.nanoTime einen großen Einfluss auf das Ergebnis.
Natürlich gelten die Einschränkungen bei der Verwendung der Wanduhr: Einflüsse der JIT-Kompilierung, mehrere Threads / Prozesse usw. Daher müssen Sie die Methode zuerst viele Male ausführen , damit der JIT-Compiler seine Arbeit erledigt, und dann Wiederholen Sie diesen Test mehrmals und nehmen Sie die niedrigste Ausführungszeit.
quelle
Zu diesem Zweck verwenden wir AspectJ- und Java-Annotationen. Wenn wir die Ausführungszeit für eine Methode kennen müssen, kommentieren wir sie einfach. Eine erweiterte Version könnte eine eigene Protokollebene verwenden, die zur Laufzeit aktiviert und deaktiviert werden kann.
quelle
JEP 230: Microbenchmark Suite
Zu Ihrer Information , JEP 230: Microbenchmark Suite ist ein OpenJDK- Projekt für:
Diese Funktion ist in Java 12 verfügbar .
Java Microbenchmark Harness (JMH)
Schauen Sie sich für frühere Java-Versionen das JMH- Projekt (Java Microbenchmark Harness) an , auf dem JEP 230 basiert.
quelle
Wirklich guter Code.
http://www.rgagnon.com/javadetails/java-0585.html
quelle
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); }
Sie können Perf4j verwenden . Sehr cooles Dienstprogramm. Die Verwendung ist einfach
Weitere Informationen finden Sie im EntwicklerhandbuchBearbeiten: Projekt scheint tot
quelle
quelle
Grundsätzlich mache ich Variationen davon, aber wenn Sie bedenken, wie die Hotspot-Kompilierung funktioniert, müssen Sie die ersten Messungen verwerfen und sicherstellen, dass Sie die Methode in einer realen (anwendungsspezifischen) Anwendung verwenden, wenn Sie genaue Ergebnisse erzielen möchten.
Wenn die JIT beschließt, sie zu kompilieren, variieren Ihre Zahlen stark. Also sei dir einfach bewusst
quelle
Mit AOP / AspectJ und
@Loggable
Anmerkungen unter jcabi-Aspekten können Sie dies einfach und kompakt tun:Jeder Aufruf dieser Methode wird an die SLF4J-Protokollierungsfunktion mit
DEBUG
Protokollierungsstufe gesendet . Und jede Protokollnachricht enthält die Ausführungszeit.quelle
Spring bietet eine Dienstprogrammklasse org.springframework.util.StopWatch gemäß JavaDoc:
Verwendungszweck:
Ausgabe:
Mit Aspekten:
quelle
Ich habe eine Methode geschrieben, um die Ausführungszeit der Methode in einer gut lesbaren Form zu drucken. Die Berechnung der Fakultät von 1 Million dauert beispielsweise ungefähr 9 Minuten. Die Ausführungszeit wird also wie folgt gedruckt:
Der Code ist hier:
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun. Normalerweise greife ich auf so etwas zurück:
oder dasselbe mit System.nanoTime ();
Für etwas mehr auf der Benchmarking-Seite scheint es auch dieses zu geben: http://jetm.void.fm/ Ich habe es jedoch nie versucht.
quelle
Sie können die Metrikbibliothek verwenden, die verschiedene Messinstrumente bereitstellt. Abhängigkeit hinzufügen:
Und konfigurieren Sie es für Ihre Umgebung.
Methoden können mit @Timed kommentiert werden :
oder mit Timer umwickeltes Stück Code :
Aggregierte Metriken können in die Konsole, JMX, CSV oder andere exportiert werden.
@Timed
Beispiel für die Ausgabe von Metriken:quelle
Wenn Sie Wanduhrzeit wollen
quelle
Wie "skaffman" sagte, verwenden Sie AOP ODER Sie können das Laufzeit-Bytecode-Weben verwenden, genau wie die Tools zur Abdeckung von Unit-Test-Methoden, um den aufgerufenen Methoden transparent Timing-Informationen hinzuzufügen.
Sie können sich Code ansehen, der von Open Source-Tools wie Emma verwendet wird ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). Das andere OpenSource-Coverage-Tool ist http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Wenn Sie es schließlich schaffen, das zu tun, was Sie sich vorgenommen haben, pls. Teile es der Community hier mit deinen Ameisenaufgaben / Gläsern zurück.
quelle
quelle
Ich habe den Code von der richtigen Antwort geändert, um das Ergebnis in Sekunden zu erhalten:
quelle
Sie können die Stoppuhrklasse aus dem Spring Core-Projekt verwenden:
Code:
Dokumentation für die Stoppuhr: Einfache Stoppuhr , die das Timing einer Reihe von Aufgaben ermöglicht und die Gesamtlaufzeit und die Laufzeit für jede benannte Aufgabe anzeigt. Verbirgt die Verwendung von System.currentTimeMillis (), verbessert die Lesbarkeit des Anwendungscodes und verringert die Wahrscheinlichkeit von Berechnungsfehlern. Beachten Sie, dass dieses Objekt nicht threadsicher ist und keine Synchronisation verwendet. Diese Klasse wird normalerweise verwendet, um die Leistung während des Proof-of-Concepts und der Entwicklung zu überprüfen, und nicht als Teil von Produktionsanwendungen.
quelle
Sie können dies versuchen, wenn Sie nur die Zeit wissen möchten.
quelle
Ok, dies ist eine einfache Klasse, die für ein einfaches Timing Ihrer Funktionen verwendet werden kann. Darunter befindet sich ein Beispiel.
Anwendungsbeispiel:
Beispiel für die Konsolenausgabe:
quelle
In Java 8 wird eine neue Klasse mit dem Namen
Instant
eingeführt. Gemäß Dokument:Dies kann verwendet werden als:
Es wird gedruckt
PT7.001S
.quelle