Gibt es einen Java-Profiler, mit dem kurzlebige Anwendungen erstellt werden können? Die Profiler, die ich bisher gefunden habe, scheinen mit Anwendungen zu arbeiten, die bis zur Beendigung des Benutzers laufen. Ich möchte jedoch Anwendungen profilieren, die wie Befehlszeilendienstprogramme funktionieren. Es wird sofort ausgeführt und beendet. Tools wie VisualVM oder NetBeans Profiler erkennen nicht einmal, dass die Anwendung ausgeführt wurde.
Ich suche etwas Ähnliches wie Pythons cProfile, da das Profiler-Ergebnis zurückgegeben wird, wenn die Anwendung beendet wird.
Sie können Ihre Anwendung mit dem JVM-HPROF-Profil profilieren.
Es bietet zwei Methoden:
Diese Methode zeigt, wie oft Methoden oben auf dem Stapel gefunden wurden.
%Vor%Diese Methode zählt die tatsächlichen Aufrufe einer Methode. Der Instrumentierungscode wurde zuvor von der JVM eingegeben.
%Vor%Hinweis: Diese Methode verlangsamt die Ausführungszeit drastisch.
Bei beiden Methoden lautet der Standarddateiname java.hprof.txt
, wenn die Option file=
nicht vorhanden ist.
Vollständige Hilfe erhalten Sie mit java -agentlib:hprof=help
oder finden Sie auf Orakel-Dokumentation
Sun Java 6 hat das java -Xprof
, das ' Ich gebe Ihnen einige Profiling-Daten.
Ein Programm mit 30 Sekunden ist nicht kurzlebig. Was Sie wollen, ist ein Profiler, der Ihr Programm starten kann, anstatt Sie an ein laufendes System anzuhängen. Ich glaube, dass die meisten Profiler das können, aber Sie würden höchstwahrscheinlich eines in einer IDE am besten mögen. Schau dir Netbeans an.
Das Profilieren von kurz laufenden Java-Anwendungen hat einige technische Schwierigkeiten:
Sie können dies beheben, indem Sie die Anwendung so ändern, dass sie in einer Schleife mehrmals ausgeführt wird, wie von @Mike vorgeschlagen. Sie werden Probleme haben, wenn Ihre App System.exit()
aufruft, aber das Hauptproblem ist ...
Ich weiß nicht, ob Profiler versuchen, JVM-Aufwärmeffekte zu kompensieren. Aber selbst wenn sie dies tun, beeinflussen diese Effekte das tatsächliche Verhalten Ihrer Anwendungen, und es gibt nicht viel, was der Anwendungsentwickler tun kann, um sie zu mindern.
Zurück zu meinem vorherigen Punkt ... Wenn Sie eine kurzlebige App in einer Schleife ausführen, tun Sie etwas, das sein normales Ausführungsmuster ändert und die JVM-Aufwärmkomponente entfernt. Wenn Sie also die Methode optimieren, die etwa 50% der Ausführungszeit in der modifizierten App einnimmt, ist das wirklich 50% der Zeit ohne JVM-Warmup . Wenn JVM Warmup etwa 80% der Ausführungszeit verwendet, wenn die App normal ausgeführt wird, optimieren Sie tatsächlich 50% von 20% ... und das ist den Aufwand nicht wert.
Wenn es nicht lange genug dauert, wickle einfach eine Schleife um es herum, eine Endlosschleife, wenn du magst. Dies hat keine Auswirkungen auf die in Prozent oder in Codezeilen verwendeten inklusiven Zeitprozentsätze. Dann, da es viel Zeit braucht, Ich verlasse mich nur auf diese Technik . Das sagt aus, welche Codezeilen, ob Funktionsaufrufe oder nicht, den höchsten Prozentsatz an Zeit kosten und daher am meisten gewinnen würden, wenn sie vermieden werden könnten.
Starten Sie Ihre Anwendung mit aktivierter Profilerstellung und warten Sie, bis der Profiler angehängt ist. Jeder Profiler, der der Java-Profiling-Architektur entspricht, sollte funktionieren. Ich habe das mit NetBeans Profiler versucht.
im Grunde, wenn Ihre Anwendung startet, wartet es auf einen Profiler vor der Ausführung angefügt werden. So kann technisch sogar eine Zeile der Codeausführung profiliert werden.
Mit diesem Ansatz können Sie alle Arten von Dingen aus Threads, Speicher, CPU, Methode / Klasse Aufrufzeiten / Dauer profilieren ...
Der SD Java Profiler kann Anweisungsblock-Ausführungszählungsdaten erfassen, unabhängig davon, wie kurz Ihr Lauf ist . Die relativen Ausführungszahlen sagen Ihnen, wo die Zeit verbracht wurde.
Ich schlage vor, dass Sie yourkit versuchen. Es kann von Anfang an ein Profil erstellen und die Ergebnisse nach Abschluss des Programms ausgeben. Sie müssen dafür bezahlen, aber Sie können eine Evaluierungslizenz erhalten oder die EAP-Version ohne eine verwenden. (Zeitlich begrenzt)
YourKit kann eine Momentaufnahme einer Profilsitzung erstellen, die später in der YourKit GUI analysiert werden kann. Ich nutze dies, um eine kurzlebige Befehlszeilenanwendung zu profilieren, an der ich arbeite. Siehe meine Antwort zu diese Frage für Details.
Tags und Links java optimization profiling profiler