2009-07-07 5 views
5

Ich habe Yourkit 8.0 verwendet, um eine mathematisch intensive Anwendung unter Mac OS X (10.5.7, Apple JDK 1.6.0_06-b06-57) zu erstellen Verhalten in den CPU-Profilergebnissen.Profilieren von nativen Methoden in Java - seltsame Ergebnisse

Zum Beispiel - Ich habe einen Profiling-Lauf mit Sampling, die berichtet, dass 40% der 10-Minuten-Laufzeit der Anwendung in der StrictMath.atan-Methode ausgegeben wurde. Ich fand das rätselhaft, aber ich nahm es bei seinem Wort und verbrachte etwas Zeit damit, atan durch eine extrem einfache polynomische Anpassung zu ersetzen.

Wenn ich die Anwendung erneut ausgeführt habe, dauerte es fast genau die gleiche Zeit wie zuvor (10 Minuten) - aber mein atan Ersatz zeigte sich nirgends in den Profilergebnissen. Stattdessen stiegen die Prozentsätze für die Laufzeit der anderen großen Hotspots einfach, um das auszugleichen.

Zusammengefasst:

ERGEBNISSE MIT StrictMath.atan (native Methode)
Gesamtlaufzeit: 10 Minuten
Methode 1: 20%
Methode 2: 20%
Methode 3: 20%
StrictMath.atan: 40%

ERGEBNISSE MIT vereinfachte, reine Java-atan
Gesamtlaufzeit: 10 minu TES
Methode 1: 33%
Methode 2: 33%
Methode 3: 33%

(Methods 1,2,3 führen keine atan Anrufe)

Jede Idee, was mit diesem Verhalten? Die gleichen Ergebnisse erzielte ich mit dem JProfiler von EJ-Technologies. Es scheint, als ob die JDK-Profilerstellungs-API, zumindest unter OS X, ungenaue Ergebnisse für native Methoden meldet.

+0

Ich wäre nicht überrascht, wenn 'atan' ein intrinsischer wäre - anstatt eine Methode aufzurufen, wird der entsprechende Maschinencode inline injiziert. –

+0

Ich habe dies auch mit verschiedenen Methoden in StrictMath unter Mac OS X 10.7 (und früheren Versionen) auch erlebt. –

+0

Gibt es also eine Lösung für dieses Problem? – ziggystar

Antwort

3

Dies kann aufgrund von Inkonsistenzen bei der Probenahme auftreten. Wenn zum Beispiel eine Methode eine gewisse Zeit benötigt, aber nicht sehr lange dauert, ist es für die Stichprobe möglich, sie zu verpassen. Ich glaube auch, dass die Garbage Collection niemals während eines Samples stattfindet, aber wenn ein Code eine Menge von Garbage Collection verursacht, kann er sehr zu einer Verlangsamung beitragen, ohne im Sample zu erscheinen.

In ähnlicher Situation habe ich es sehr hilfreich gefunden, zweimal zu laufen, einmal mit Tracing sowie einmal mit Sampling. Wenn eine Methode in beiden erscheint, verwendet sie wahrscheinlich eine Menge CPU, sonst könnte sie nur ein Artefakt des Sampling-Prozesses sein.

0

Ich finde YourKit übertreibt die Kosten für den Aufruf von Untermethoden (aufgrund seiner Protokollierungsmethode, nehme ich an). Wenn Sie nur dem Rat folgen, den das Profil Ihnen gibt, werden Sie am Ende nur Funktionen ohne echten Gewinn zusammenführen, da der HotSpot dies normalerweise hervorragend tut.

Daher würde ich sehr empfehlen, Chargen komplett außerhalb von Profilern zu testen, um eine bessere Vorstellung davon zu bekommen, ob Änderungen wirklich nützlich sind (es mag offensichtlich erscheinen, aber das kostet mich Entwicklungszeit).

0

Da Sie einen Mac verwenden, können Sie versuchen, Apple's Shark profiler (kostenloser Download von ADC), die Java-Unterstützung und Apples Performance-Gruppe hat eine Menge Zeit in das Tool.

Wie Nick darauf hingewiesen hat, kann das Sampling irreführend sein, wenn das Abtastintervall nahe genug an der Ausführungszeit der Funktion liegt und der Profiler selten prüft, wann die Funktion tatsächlich ausgeführt wird. Ich weiß nicht, ob YourKit dies unterstützt, aber in Shark können Sie das Sampling-Intervall auf etwas anderes als die Standard 10ms ändern und sehen, ob die Ergebnisse wesentlich anders sind. Es gibt auch einen separaten Call-Tracing-Modus, der jede Funktion für die Eingabe/Rückgabe aufzeichnet. Dies vermeidet die Möglichkeit von Aliasing-Fehlern, sammelt jedoch eine Menge Daten und einen höheren Overhead, was von Bedeutung ist, wenn Ihre App irgendeine Art von Echtzeit ausführt wird bearbeitet.

0

Sie können sich die Parameter ansehen, die an die drei Methoden übergeben werden. Es kann sein, dass die Zeit damit verbracht wird, Rückgabewerte oder Methoden zu erzeugen, die viele temporäre Objekte erzeugen.

-1

Profiler kann so sein.

This is the method I use.

funktioniert jedes Mal.

And this is why.

+0

Möchten Sie erklären, warum dies zu anderen Ergebnissen führt als die eines Sampling-Profilers, der diesen Prozess automatisiert? – ziggystar

+0

@ziggystar: Einige Sampling-Profiler automatisieren die Hälfte des Prozesses, nämlich jene, die den gesamten Stack auf Wanduhrzeit (nicht CPU-Zeit) abtasten. Die Hälfte des Prozesses, den sie nicht automatisieren, ist die Entdeckung von Leistungsproblemen, die Sie beheben können. Wenn eine Anweisung oder Funktion nur ein kleines% enthält, liegt das Problem anderswo, aber das Problem wird dadurch nicht eingeschränkt. Einfach zu wissen, dass eine Zeile Code, Funktion oder "Pfad" "heiß" ist, sagt Ihnen nicht viel. Es ist aufschlussreicher, wenn Sie spezifische repräsentative Stichproben in ihrer Gesamtheit untersuchen können. ... –

+0

@ziggystar: ... Das Ergebnis ist, dass Sie Beschleunigungen finden, die Sie nicht einmal mit einem sehr guten Profiler finden würden. Wenn Sie diese beheben und den Prozess wiederholen, sind Probleme, die zuvor klein waren, jetzt größer, weil das Programm weniger Zeit benötigt. Also, einer nach dem anderen, Sie reparieren diese und die compounded Beschleunigung kann überraschend sein. Wie viel Beschleunigung hast du jemals mit einem Profiler bekommen? Wenn die Antwort mehr als 40% ist, würde mich das überraschen. –

0

es erwähnenswert, dass Java-Methoden inlined werden können, wenn sie klein genug sind, jedoch native Methoden unter verschiedenen Regeln inlined. Wenn eine Methode inline ist, erscheint sie nicht im Profiler (jedenfalls nicht YourKit)

Verwandte Themen