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
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.
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.
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.
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.).
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%
Tags und Links java multithreading performance