Wie planen Sie die Ausführung eines Java-Programms? Ich bin mir nicht sicher, in welcher Klasse ich das machen soll.
Ich suche etwas wie:
// Some timer starts here
for (int i = 0; i < length; i++) {
// Do something
}
// End timer here
System.out.println("Total execution time: " + totalExecutionTime);
final
hat den Vorteil, dass Sie es nicht versehentlich zuweisen können (sowie andere Vorteile wie anonymen Klassenzugriff usw.). In diesem Code würde es keinen Unterschied machen. Es ist eine ziemlich übliche Praxis, alles zu machenfinal
und es nur zufinal
entschlüsseln, wenn es nötig ist.Beachten Sie, dass es einige Probleme
System#nanoTime()
gibt, die bei Multi-Core-CPUs nicht zuverlässig zum Aufzeichnen der verstrichenen Zeit verwendet werden können. Jeder Core verfügt über einen eigenen TSC ( Time Stamp Counter) ): Dieser Zähler wird verwendet, um die Nano-Zeit zu ermitteln (tatsächlich ist dies der Fall) die Anzahl der Ticks seit dem Start der CPU).Wenn das Betriebssystem keine TSC-Zeitverzerrung durchführt, um die Kerne synchron zu halten, kann die relative Zeit sporadisch rückwärts springen, wenn ein Thread beim ersten Lesen auf einem Kern geplant und dann auf einen anderen Kern umgeschaltet wird und vorwärts.
Ich habe dies vor einiger Zeit bei AMD / Solaris beobachtet, wo verstrichene Zeiten zwischen zwei Zeitpunkten manchmal entweder als negative Werte oder als unerwartet große positive Zahlen zurückkamen. Es war ein Solaris-Kernel-Patch und eine BIOS-Einstellung erforderlich, um AMD PowerNow! aus, was es zu lösen schien.
Außerdem gibt es (AFAIK) einen bislang nicht behobenen Fehler bei der Verwendung von Java
System#nanoTime()
in einer VirtualBox-Umgebung. Dies verursacht für uns alle möglichen bizarren intermittierenden Threading-Probleme, da ein Großteil desjava.util.concurrency
Pakets auf Nano-Zeit angewiesen ist.Siehe auch:
Ist System.nanoTime () völlig nutzlos? http://vbox.innotek.de/pipermail/vbox-trac/2010-January/135631.html
quelle
Sie können nutzen
System#nanoTime()
. Holen Sie es sich vor und nach der Ausführung und rechnen Sie einfach. Es wird oben bevorzugt,System#currentTimeMillis()
weil es eine bessere Präzision hat. Abhängig von der verwendeten Hardware und Plattform kann es ansonsten zu einer falschen Lücke in der verstrichenen Zeit kommen. Hier mit Core2Duo unter Windows kann zwischen ca. 0 und ~ 15ms eigentlich nichts berechnet werden.Ein fortgeschritteneres Tool ist ein Profiler .
quelle
nanoTime()
hat ein Problem (zumindest unter Windows); Der Zeitstempel ist spezifisch für den Prozessorkern. Ich hatte ein Programm, das eine negative Ausführungszeit hatte, weil es den Zeitstempel "Start" auf einem Kern und den Zeitstempel "Stopp" auf einem anderen Kern hatte.Sie erhalten die aktuelle Systemzeit in Millisekunden:
Dann tun Sie, was Sie tun werden:
Dann sehen Sie, wie lange es gedauert hat:
quelle
Für einfache Dinge kann System.currentTimeMillis () funktionieren.
Es ist tatsächlich so üblich, dass meine IDE so eingerichtet ist, dass bei Eingabe von "t0" die folgende Zeile generiert wird:
Für kompliziertere Dinge möchten Sie wahrscheinlich statistische Zeitmessungen wie hier verwenden (scrollen Sie ein wenig nach unten und sehen Sie sich die Zeitmessungen einschließlich Standardabweichungen usw. an):
http://perf4j.codehaus.org/devguide.html
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
Hier sind einige Möglichkeiten, um die Ausführungszeit in Java zu ermitteln:
1) System.nanoTime ()
2) System.currentTimeMillis ()
3) Instant.now ()
oder
4) Date.getTime ()
quelle
lange verwenden
startTime=System.currentTimeMillis()
für die Startzeit am oberen Rand der Schleifestellen
long endTime= System.currentTimeMillis();
außerhalb des Endes der Schleife. Sie müssen die Werte subtrahieren, um die Laufzeit in Millisekunden zu erhalten.Wenn Sie Zeit in Nanosekunden wünschen, schauen Sie sich das an
System.nanoTime()
quelle
Ich habe eine Funktion höherer Ordnung erstellt, die den Code verwendet, den Sie in / als Lambda messen möchten:
Nennen Sie es so:
Ausgabe:
Besonderer Dank geht an Andy Turner , der mir geholfen hat, die Redundanz zu verringern. Siehe hier .
quelle
Schau es dir an
System.currentTimeMillis()
.quelle
Sie können auch Perf4J ausprobieren. Es ist eine gute Möglichkeit, das zu tun, wonach Sie suchen, und hilft bei aggregierten Leistungsstatistiken wie Mittelwert, Minimum, Maximum, Standardabweichung und Transaktionen pro Sekunde über einen festgelegten Zeitraum. Ein Auszug aus http://perf4j.codehaus.org/devguide.html :
Ausgabe:
quelle
quelle
Die Verwendung von System.currentTimeMillis () ist der richtige Weg, dies zu tun. Wenn Sie jedoch die Befehlszeile verwenden und das gesamte Programm ungefähr und schnell zeitlich festlegen möchten, denken Sie an Folgendes:
Dadurch können Sie den Code und die Zeit Ihrer App nicht ändern.
quelle