Frage

Verwendet jemals jemand Stopwatch -Benchmarking oder sollte ein Leistungstool immer verwendet werden? Gibt es gute kostenlose Tools für Java? Welche Tools verwenden Sie?

Um meine Bedenken zu klären, unterliegt das Stoppuhr -Benchmarking aufgrund der Bedienungssystemplanung dem Fehler. Bei einem bestimmten Lauf Ihres Programms kann das Betriebssystem in der Mitte der Funktion, die Sie zeitlich sind, einen weiteren (oder mehrere) Vorgang planen. In Java ist die Dinge noch ein bisschen schlechter, wenn Sie versuchen, eine Thread -Anwendung zu messen, da der JVM -Scheduler noch ein bisschen mehr Zufälligkeit in den Mix einfließt.

Wie begehen Sie das Betriebssystemplanung beim Benchmarking?

War es hilfreich?

Lösung

Stoppuhr -Benchmarking ist in Ordnung, vorausgesetzt, Sie messen genügend Iterationen, um sinnvoll zu sein. Normalerweise benötige ich eine verstrichene Zeit von einer Reihe von einstelligen Sekunden. Andernfalls sind Ihre Ergebnisse durch Planung und andere O/S -Unterbrechungen Ihres Prozesses leicht verzerrt.

Dafür verwende ich ein paar statische Methoden, die ich vor langer Zeit gebaut habe, die auf System.currentTimeMillis().

Für die Profilerstellung habe ich verwendet JProfiler Seit einigen Jahren und fand es sehr gut. Ich habe kürzlich umgesehen Yourkit, was von der Website großartig erscheint, aber ich habe es überhaupt nicht persönlich benutzt.

Um die Frage nach Planung von Unterbrechungen zu beantworten, stelle ich fest, dass wiederholte Läufe bis zur Konsistenz in der Praxis durchgeführt werden, um anomale Ergebnisse aus der Prozessplanung auszurotten. Ich finde auch, dass die Thread -Planung keine praktischen Auswirkungen auf Läufe zwischen 5 und 30 Sekunden hat. Nachdem Sie die wenigen Sekunden -Schwellenplanung bestanden haben, haben ich nach meiner Erfahrung nach vernachlässigbaren Auswirkungen auf die Ergebnisse festgestellt, dass ein 5 -Sekunden -Lauf durchschnittlich mit einem 5 -minütigen Lauf für Zeit/Iteration den gleichen Durchschnitt erzielt.

Möglicherweise möchten Sie auch den getesteten Code etwa 10.000 Mal in Betracht ziehen, um die JIT zu "erwärmen", abhängig davon, wie oft Sie erwarten, dass der getestete Code im realen Leben im Laufe der Zeit läuft.

Andere Tipps

Es ist völlig gültig, solange Sie große Zeitintervalle der Zeit messen. Ich würde 20 bis 30 Läufe von dem ausführen, was Sie testen möchten, damit die Gesamtzeit über 1 Sekunde beträgt. Ich habe festgestellt, dass Zeitberechnungen basierend auf System.currentTimemillis () entweder 0 ms oder ~ 30 ms sind; Ich glaube nicht, dass Sie etwas präziseres bekommen können. Möglicherweise möchten Sie System ausprobieren. Nanotime () Wenn Sie wirklich ein kleines Zeitintervall messen müssen:

Ein Profiler gibt Ihnen detailliertere Informationen, die dazu beitragen können, Leistungsprobleme zu diagnostizieren und zu beheben.

In Bezug auf die tatsächliche Messung ist die Stoppuhrzeit das, was Benutzer bemerken. Wenn Sie also bestätigen möchten, dass die Dinge innerhalb akzeptabler Grenzen liegen, ist die Stoppuhrzeit in Ordnung.

Wenn Sie jedoch Probleme beheben möchten, kann ein Profiler sehr hilfreich sein.

Stoppwatch ist eigentlich der beste Benchmark!

Das reale End -to -End -Benutzer -Reaktionszeit ist die Zeit, die tatsächlich wichtig ist.

Es ist nicht immer möglich, diese Zeit mithilfe der verfügbaren Tools zu erhalten. Beispielsweise enthalten die meisten Testwerkzeuge nicht die Zeit, die ein Browser benötigt, um eine Seite zu rendern, so Tools, aber 5 Sekunden plus Reaktionszeit für den Benutzer.

Die Tools eignen sich hervorragend für automatisierte Tests und für die Problembestimmung, verlieren aber nicht aus den Augen, was Sie wirklich messen möchten.

Sie müssen eine realistische Anzahl von Iterationen testen, da Sie unterschiedliche Antworten erhalten, je nachdem, wie Sie das Timing testen. Wenn Sie nur einmal eine Operation ausführen, kann es irreführend sein, den Durchschnitt vieler Iterationen zu ergreifen. Wenn Sie wissen möchten, dass die Zeit, die es dauert, nachdem sich die JVM aufgewärmt hat, viele (z. B. 10.000) Iterationen ausführen können, die nicht in den Zeiten enthalten sind.

Ich schlage auch vor, dass Sie verwenden System.nanoTime() da ist es viel genauer. Wenn Ihre Testzeit etwa 10 Mikrosekunden oder weniger beträgt, möchten Sie dies nicht zu oft nennen, oder es kann Ihr Ergebnis ändern. (ZB, wenn ich 5 Sekunden lang teste und ich möchte wissen, wann dies los ist, bekomme ich die Nanotime nur alle 1000 Iterationen, wenn ich weiß, dass eine Iteration sehr schnell ist)

Wie begehen Sie das Betriebssystemplanung beim Benchmarking?

Benchmark für lang genug Auf einem System, das für die Maschine repräsentativ ist, werden Sie verwenden. Wenn Ihr Betriebssystem Ihre Anwendung verlangsamt, sollte dies Teil des Ergebnisses sein.

Es macht keinen Sinn zu sagen, dass mein Programm schneller sein würde, wenn ich kein Betriebssystem hätte.

Wenn Sie verwenden Linux, Sie können Tools wie verwenden wie numactl, chrt und taskset steuern, wie CPUs verwendet werden und die Planung.

Profiler können dem Zeitpunkt im Wege stehen, daher würde ich eine Kombination aus Stoppuhrzeit verwenden, um die Gesamtleistungsprobleme zu identifizieren, und dann den Profiler verwenden, um dort zu trainieren, wo die Zeit ausgegeben wird. Wiederholen Sie den Vorgang nach Bedarf.

Immerhin ist es wahrscheinlich die zweitbeliebteste Form des Benchmarking, direkt nach "No -Patch -Benchmarking" - wo wir sagen: "Diese Aktivität scheint langsam, dass man schnell erscheint."

Normalerweise ist das, was am wichtigsten ist, zu optimieren, was auch immer die Benutzererfahrung beeinträchtigt - was am häufigsten davon abhängt, wie häufig Sie die Aktion ausführen und was auch immer gleichzeitig vor sich geht. Andere Formen des Benchmarkings helfen oft nur auf Null.

Ich denke, eine wichtige Frage ist die Komplexität und Länge der Operation.

Manchmal verwende ich sogar mysikalische Stoppuhrmessungen, um zu sehen, ob etwas Minuten, Stunden, Tage oder sogar Wochen dauert (ich arbeite mit einer Anwendung, bei der die Laufzeiten auf den Bestellungen von mehreren Tagen nicht unbekannt sind, selbst wenn Sekunden und Minuten sind Die häufigste Zeitspanne).

Die Automatisierung, die durch Anrufe auf jede Art von Taktsystem auf dem Computer gewährt wird, wie der Java Millis -Anruf, auf den in dem verknüpften Artikel genannt wird, ist eindeutig überlegen als manuell zu sehen, wie lange etwas läuft.

Profiler sind nett, wenn sie funktionieren, aber ich hatte Probleme, sie auf unsere Anwendung anzuwenden, die normalerweise die dynamische Codegenerierung, dynamische Belastung von DLLs und Arbeiten in den beiden integrierten Just-in-Time-Kompilier-Skriptsprachen von betrifft meine Bewerbung. Sie sind ziemlich oft darauf beschränkt, eine einzelne Quellsprache und andere unrealistische Erwartungen an komplexe Software zu übernehmen.

Ich habe heute ein Programm durchgeführt, das Informationen aus einer Reihe von DBase -Dateien durchsucht und gesammelt hat. eine Stunde laufen. Ich habe mir den Code angesehen, erraten, was der Engpass war, eine geringfügige Verbesserung des Algorithmus vorgenommen hat und das Programm erneut durchführte, diesmal in 2,5 Minuten.

Ich brauchte keine ausgefallenen Profiling -Tools oder Benchmark -Suiten, um mir mitzuteilen, dass die neue Version eine erhebliche Verbesserung war. Wenn ich die Laufzeit weiter optimieren müsste, hätte ich wahrscheinlich eine anspruchsvollere Analyse durchgeführt, aber dies war nicht notwendig. Ich finde, dass diese Art von "Stoppuhr-Benchmarking" in einer Reihe von Fällen eine akzeptable Lösung ist und in diesen Fällen auf fortgeschrittenere Tools zeitaufwändiger wäre.

Ich denke nicht, dass Stoppwatch -Benchmarking zu schrecklich ist, aber wenn Sie auf einen Solaris- oder OS X -Computer einsteigen können, sollten Sie sich DTRACE ansehen. Ich habe es verwendet, um einige großartige Informationen über das Timing in meinen Anwendungen zu erhalten.

Ich benutze immer Stoppuhr -Benchmarking, da es so viel einfacher ist. Die Ergebnisse müssen für mich jedoch nicht sehr genau sein. Wenn Sie genaue Ergebnisse benötigen, sollten Sie kein Stopwatch -Benchmarking verwenden.

Das mache ich die ganze Zeit. Ich würde lieber einen Profiler verwenden, aber der Anbieter der domänenspezifischen Sprache, mit der ich arbeite, liefert keinen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top