Tipps zum Schreiben von Mikro-Benchmarks von den Schöpfern von Java HotSpot :
Regel 0: Lesen Sie einen seriösen Artikel über JVMs und Micro-Benchmarking. Ein guter Artikel ist Brian Goetz, 2005 . Erwarten Sie nicht zu viel von Micro-Benchmarks; sie messen nur einen begrenzten Bereich der JVM-Leistungsmerkmale.
Regel 1: Fügen Sie immer eine Aufwärmphase ein, in der Ihr Testkernel vollständig durchläuft, um alle Initialisierungen und Kompilierungen vor der/den Zeitmessphase(n) auszulösen. (Weniger Iterationen sind in der Aufwärmphase in Ordnung. Als Faustregel gelten mehrere zehntausend Iterationen der inneren Schleife.)
Regel 2: Laufen Sie immer mit -XX:+PrintCompilation
, -verbose:gc
usw., so dass Sie überprüfen können, ob der Compiler und andere Teile der JVM während der Timing-Phase nicht unerwartete Arbeiten durchführen.
Regel 2.1: Drucken Sie zu Beginn und am Ende der Zeitmessungs- und Aufwärmphase Meldungen aus, damit Sie überprüfen können, dass während der Zeitmessungsphase keine Ausgabe von Regel 2 erfolgt.
Regel 3: Achten Sie auf den Unterschied zwischen -client
y -server
sowie OSR und reguläre Kompilierungen. Die -XX:+PrintCompilation
Flag meldet OSR-Kompilierungen mit einem at-Zeichen, um z.B. den nicht-initialen Einstiegspunkt zu kennzeichnen: Trouble$1::run @ 2 (41 bytes)
. Bevorzugen Sie Server gegenüber Client und regulär gegenüber OSR, wenn Sie die beste Leistung wünschen.
Regel 4: Achten Sie auf die Auswirkungen der Initialisierung. Drucken Sie nicht zum ersten Mal während der Timing-Phase, da durch das Drucken Klassen geladen und initialisiert werden. Laden Sie keine neuen Klassen außerhalb der Aufwärmphase (oder der abschließenden Berichtsphase), es sei denn, Sie testen das Laden von Klassen speziell (und in diesem Fall laden Sie nur die Testklassen). Regel 2 ist Ihre erste Verteidigungslinie gegen solche Effekte.
Regel 5: Achten Sie auf die Auswirkungen von Deoptimierung und Neukompilierung. Nehmen Sie keinen Codepfad zum ersten Mal in der Timing-Phase, denn der Compiler könnte den Code auf der Grundlage einer früheren optimistischen Annahme, dass der Pfad überhaupt nicht verwendet werden würde, verwerfen und neu kompilieren. Regel 2 ist Ihre erste Verteidigungslinie gegen solche Effekte.
Regel 6: Verwenden Sie geeignete Werkzeuge, um die Gedanken des Compilers zu lesen, und lassen Sie sich von dem Code, den er produziert, überraschen. Überprüfen Sie den Code selbst, bevor Sie Theorien darüber aufstellen, was etwas schneller oder langsamer macht.
Regel 7: Reduzieren Sie das Rauschen bei Ihren Messungen. Führen Sie Ihren Benchmark auf einem leisen Rechner durch, und zwar mehrmals, wobei Sie Ausreißer aussortieren. Verwenden Sie -Xbatch
um den Compiler mit der Anwendung zu serialisieren, und erwägen Sie die Einstellung -XX:CICompilerCount=1
um zu verhindern, dass der Compiler parallel zu sich selbst läuft. Versuchen Sie Ihr Bestes, um den GC-Overhead zu reduzieren, setzen Sie Xmx
(groß genug) ist gleich Xms
und verwenden UseEpsilonGC
wenn sie verfügbar ist.
Regel 8: Verwenden Sie eine Bibliothek für Ihren Benchmark, da diese wahrscheinlich effizienter ist und bereits für diesen einzigen Zweck getestet wurde. Wie zum Beispiel JMH , Messschieber o Bill und Pauls hervorragende UCSD-Benchmarks für Java .
0 Stimmen
Siehe [diese Frage][1] von vor ein paar Minuten für einige verwandte Informationen. edit: Entschuldigung, dies sollte keine Antwort sein. Ich hätte es als Kommentar posten sollen. [1]: stackoverflow.com/questions/503877/
0 Stimmen
Nachdem ich vorhatte, den Fragesteller auf eine Frage wie diese zu verweisen, stellte ich fest, dass es diese Frage nicht gab. Hier ist sie also, und hoffentlich werden im Laufe der Zeit einige gute Tipps gesammelt.
6 Stimmen
Java 9 könnte einige Funktionen für Micro-Benchmarking bieten: openjdk.java.net/jeps/230
3 Stimmen
@Raedwald Ich denke, dass JEP darauf abzielt, dem JDK-Code einige Mikro-Benchmarks hinzuzufügen, aber ich glaube nicht, dass jmh im JDK enthalten sein wird...
0 Stimmen
Wahrscheinlich ein Duplikat: Wie kann ich die Ausführung einer Methode in Java zeitlich festlegen?
2 Stimmen
@Raedwald Hallo aus der Zukunft. Er hat es nicht in die Auswahl geschafft .
1 Stimmen
Voir : JMH, ein Java-Harness zum Erstellen, Ausführen und Analysieren von Nano-, Mikro-, Milli- und Makro-Benchmarks y JEP 230: Mikrobenchmark-Suite und doppelte Frage Bester Ansatz für den Umgang mit Zeitmaßnahmen? .