Was ist der Zweck von JMH @ Fork?

8

Wenn IIUC jede Verzweigung eine separate virtuelle Maschine erstellt, weil jede Instanz der virtuellen Maschine möglicherweise mit geringfügigen Unterschieden in den JIT-Anweisungen ausgeführt wird?

Ich bin auch neugierig auf das Zeitattribut in den folgenden Anmerkungen:

%Vor%

TIA, Ole

    
Ole 27.01.2016, 19:50
quelle

2 Antworten

13

JMH bietet die fork-Funktionalität aus mehreren Gründen an. Eine ist die Kompilierungsprofiltrennung, wie oben von Rafael diskutiert. Dieses Verhalten wird jedoch nicht durch die @ Forks-Annotation gesteuert (es sei denn, Sie wählen 0 Forks, dh, es werden keine Unterprozesse zum Ausführen von Benchmarks gegabelt). Sie können alle Benchmarks als Teil Ihres Benchmark-Warmups ausführen (wodurch ein gemischtes Profil für das JIT erstellt wird), indem Sie das Steuerelement für den Warmup-Modus (-wm) verwenden.

Die Realität ist, dass viele Dinge dazu führen können, Ihre Ergebnisse auf die eine oder andere Weise zu kippen und einen Benchmark mehrmals auszuführen, um Run-to-Run-Varianz zu etablieren. Dies ist eine wichtige Praxis, die JMH unterstützt (und das meiste handgerollte Framework nicht) Hilfe mit). Gründe für die Ausführung von "run to run" können sein (aber ich bin mir sicher, dass es mehr gibt):

  • Die CPU startet in einem bestimmten C-Zustand und erhöht die Frequenz an der Vorderseite der Last, überhitzt sie dann und verkleinert sie. Sie können dieses Problem auf bestimmten Betriebssystemen steuern.

  • Die Speicherausrichtung Ihres Prozesses kann zu Unterschieden beim Paging-Verhalten führen.

  • Hintergrundanwendungsaktivität.
  • Die CPU-Zuweisung durch das Betriebssystem wird variieren, was zu verschiedenen Gruppen von CPUs führt, die für jeden Lauf verwendet werden.
  • Seitencacheinhalt und -austausch
  • Die JIT-Kompilierung wird gleichzeitig ausgelöst und kann zu unterschiedlichen Ergebnissen führen (dies tritt häufiger auf, wenn größere Codebits getestet werden). Beachten Sie, dass kleine Single-Thread-Benchmarks dieses Problem normalerweise nicht haben.
  • Das GC-Verhalten kann mit geringfügig unterschiedlichen Timings von Lauf zu Lauf ausgelöst werden, was zu unterschiedlichen Ergebnissen führt.

Wenn Sie Ihren Benchmark mit mindestens ein paar Gabeln ausführen, können Sie diese Unterschiede aus dem Weg räumen und eine Vorstellung von der Run-to-Run-Varianz erhalten, die Sie in Ihrem Benchmark sehen. Ich würde empfehlen, dass Sie mit dem Standardwert von 10 beginnen und ihn je nach Benchmark experimentell abschneiden (oder erhöhen).

    
Nitsan Wakart 02.02.2016 07:14
quelle
7

Die JVM optimiert eine Anwendung, indem sie ein Profil des Verhaltens der Anwendung erstellt. Die Gabel wird erstellt, um dieses Profil zurückzusetzen. Ansonsten läuft:

%Vor%

kann zu anderen Messungen als

führen %Vor%

da das Profil des ersten Benchmarks den zweiten beeinflusst.

Die Zeiten bestimmen die Länge der Ausgaben von JMH für das Aufwärmen oder den Benchmark. Wenn diese Zeiten zu kurz sind, wird Ihre VM möglicherweise nicht ausreichend aufgewärmt oder Ihr Ergebnis weist möglicherweise eine zu hohe Standardabweichung auf.

    
Rafael Winterhalter 28.01.2016 04:37
quelle

Tags und Links