Java-Leistungsmessung

8

Ich mache einen Java-Leistungsvergleich zwischen meinen Klassen und frage mich, ob es eine Art Java Performance Framework gibt, um den Code zur Messung der Schreibleistung leichter zu machen?

Das heißt, was ich gerade mache, versucht zu messen, welchen Effekt es hat, wenn eine Methode wie in PseudoRandomUsingSynch.nextInt () synchronisiert ist, verglichen mit der Verwendung eines AtomicIntegers als "Synchronizer".

Ich versuche also zu messen, wie lange es dauert, zufällige Integer zu erzeugen, indem 3 Threads verwendet werden, die auf eine synchronisierte Methode zugreifen, die zum Beispiel 10000-mal läuft.

Ich bin mir sicher, dass es viel besser geht. Kannst du mich bitte aufklären? :)

%Vor%

die Klasse

%Vor%

Grüße

    
portoalet 14.03.2010, 03:24
quelle

6 Antworten

10

Wenn Sie die Frage ignorieren, ob ein Microbenchmark in Ihrem Fall nützlich ist (Stephen Cs Punkte sind sehr gültig), würde ich darauf hinweisen:

Erstens, höre nicht auf Leute, die sagen "es ist nicht so schwer". Ja, Microbenchmarking auf einer virtuellen Maschine mit JIT-Compilierung ist schwierig. Es ist wirklich schwierig, aussagekräftige und nützliche Zahlen aus einer Mikrobenmark zu bekommen, und jeder, der behauptet, dass es nicht schwer ist, ist entweder ein Supergenius oder macht es falsch. :)

Zweitens, ja, es gibt ein paar solcher Rahmen. Ein Blick wert (dachte, es ist in sehr frühen Pre-Release-Phase) ist Caliper , von Kevin Bourrillion und Jesse Wilson von Google. Sieht wirklich beeindruckend aus ein paar frühen Blicke auf es.

    
Cowan 14.03.2010, 12:10
quelle
8

Mehr Micro-Benchmarking-Ratschläge - Mikro-Benchmarks sagen Ihnen selten, was Sie wirklich wissen müssen ... wie schnell eine echte Anwendung läuft.

In Ihrem Fall stelle ich mir vor, dass Sie herausfinden wollen, ob Ihre Anwendung mit einem Atomic-Objekt besser funktioniert als mit synchronisierten ... oder umgekehrt. Und die wirkliche Antwort ist, dass es höchstwahrscheinlich von Faktoren abhängt, die ein Mikro-Benchmark nicht messen kann . Dinge wie die Wahrscheinlichkeit von Konflikten, wie lange Sperren gehalten werden, die Anzahl von Threads und Prozessoren und die Menge an zusätzlicher algorithmischer Arbeit, die benötigt wird, um eine atomare Aktualisierung zu einer brauchbaren Lösung zu machen.

BEARBEITEN - als Antwort auf diese Frage.

  

Also gibt es eine Möglichkeit, all diese Wahrscheinlichkeit von Konflikten zu messen, die Dauer von Sperren usw.?

In der Theorie ja. Sobald Sie die gesamte Anwendung implementiert haben, ist es möglich, sie zu messen, um diese Dinge zu messen. Aber das gibt Ihnen auch keine Antwort, denn es gibt kein Vorhersagemodell, an das Sie diese Zahlen anschließen können, um die Antwort zu geben. Und außerdem haben Sie die Anwendung bis dahin bereits implementiert.

Aber mein Punkt war nicht, dass das Messen dieser Faktoren es Ihnen ermöglicht, die Leistung vorherzusagen. (Es ist nicht so!) Es war eher so, dass ein Mikro-Benchmark es nicht erlaubt, Performance entweder vorherzusagen.

In der Praxis besteht der beste Ansatz darin, die Anwendung gemäß Ihrer Intuition zu implementieren und dann mithilfe von Profilerstellung herauszufinden, wo die wirklichen Leistungsprobleme liegen.

    
Stephen C 14.03.2010 05:19
quelle
4

Diese Leute haben eine gute JVM-Messmethodik entwickelt, damit Sie sich nicht mit gefälschten Zahlen täuschen und sie dann als Python-Skript veröffentlichen, damit Sie ihre Smarts wiederverwenden können -

statistisch rigorose Java-Leistungsbewertung (PDF-Dokument)

    
igouy 18.03.2010 20:27
quelle
3

Sie möchten die Schleife wahrscheinlich in die Aufgabe verschieben. Wie es ist, starten Sie einfach alle Threads und fast sofort sind Sie wieder Single-Thread.

Übliche Microbenchmarking-Empfehlung: Aufwärmen lassen. Neben dem Durchschnitt ist die Abweichung interessant. Verwenden Sie System.nanoTime anstelle von System.currentTimeMillis .

Spezifisch für dieses Problem ist, wie sehr die Threads kämpfen. Mit einer großen Anzahl von konkurrierenden Threads können Cas-Schleifen vergeudete Arbeit verrichten. Das Erstellen eines SecureRandom ist wahrscheinlich teuer und könnte System.currentTimeMillis in geringerem Umfang sein. Ich glaube, dass SecureRandom bereits Thread-sicher sein sollte, wenn es richtig verwendet wird.

    
Tom Hawtin - tackline 14.03.2010 03:29
quelle
3

OpenJDK Jungs haben ein Benchmarking-Tool namens JMH entwickelt:

Ссылка

Dies bietet ein recht einfaches Setup-Framework und es gibt ein paar Beispiele, die zeigen, wie man das verwendet.

Ссылка

Nichts kann Sie davon abhalten, den Benchmark falsch zu schreiben, aber sie haben einen großen Job bei der Beseitigung der nicht offensichtlichen Fehler gemacht (wie zB falsches Teilen zwischen Threads, Vermeidung von toten Codes usw.).

    
Radim Vansa 21.04.2015 09:24
quelle
1

Sie suchen also nach einem "Java Unit Performance Testing Tool"?

Verwenden Sie JUnitPerf .

Update: für den Fall, dass es noch nicht klar ist: Es unterstützt auch gleichzeitiges Testen (Multithreading). Hier ist ein Auszug aus dem Kapitel "LoadTest" des oben genannten Links, der ein Codebeispiel enthält:

  

Zum Beispiel, um einen Belastungstest von zu erstellen   10 gleichzeitige Benutzer mit jedem Benutzer   das laufen lassen   BeispielTestCase.testOneSecondResponse ()   Methode für 20 Iterationen und mit einer 1   zweite Verzögerung zwischen dem Hinzufügen von   Benutzer, verwenden Sie:

%Vor%
    
BalusC 14.03.2010 06:12
quelle