2017-09-29 3 views
1

Ich versuche, meinen Code zu profilieren, um Flaschenhals zu erkennen. Ich habe einige Profiler gesucht, aber ich finde nie, wonach ich gesucht habe.Profillinie für Linie Java

ich vielen Python in der Vergangenheit verwendet, und es gab diese Software: line_profiler, die diese Art der Rückkehr gibt:

0   Line  Hits Time Per Hit % Time Line Contents 

11           @profile 
12           def compute_prior(folder): 
13            """ 
14            Given a folder, we compute the prior of neg and pos 
15            folder = "./movie-reviews-en/train/" 
16            """ 
17            # we compute the number of positive reviews 
18   3   1719 573.0  52.9  number_positive = len([f for f in listdir(folder + "pos/")]) 
19            # then the negative 
20   3   1512 504.0  46.6  number_negative = len([f for f in listdir(folder + "neg/")]) 
21            # we add it and we have the total 
22   3   6  2.0  0.2  total = number_positive + number_negative 
23            # we devide to have the probabilites 
24   3   6  2.0  0.2  number_positive /= total 
25   3   1  0.3  0.0  number_negative /= total 
26            # we return this three numbers 
27   3   3  1.0  0.1  return [number_positive, number_negative, total] 

Gibt es etwas in der Welt Java similare?

Danke für die Antwort.

p.s: Ich kenne Yourkit, jprofiler, visualwm, aber ich möchte etwas in den Code.

+0

Warum möchten Sie es innerhalb des Codes? Das Sammeln der Profiling-Informationen wird normalerweise Ihre Anwendung ziemlich verlangsamen, so dass Sie es normalerweise auf Abruf ausführen wollen und so funktioniert jprofiler usw.. – Thomas

Antwort

0

Ich arbeite seit einiger Zeit mit der Leistungsanalyse und bin mir ziemlich sicher, dass Sie solch ein Werkzeug nicht finden werden. Ich denke nicht, dass es überhaupt möglich ist, ein solches Werkzeug zu bauen.

Es gibt viele Unwägbarkeiten in diesem Fall, zum Beispiel, dass die Hotspot-VM Code beim Lernen wahrscheinlicher Ausführungspfade oder Ausführungsfrequenzen dekompilieren und neu kompilieren wird. Daher kann die Ausführungszeit für eine Codezeile im Laufe der Zeit erheblich variieren.

Auch Ihre Überwachungslösung wird Ihre Anwendung verlangsamen und noch schlimmer: Es wird die relative Ausführungszeit Ihres Codes ändern. Dies bedeutet im Wesentlichen, dass Sie einen Hotspot an einem Ort finden, an dem kein solcher Hotspot ohne Ihre Überwachung existieren würde.

Sie können ein solches Werkzeug selbst bauen, das heißt, die Ausführungszeiten über System.nanoTime() messen, aber Sie werden sicherlich feststellen, dass dies kein Weg ist, zu folgen.

Mein Vorschlag wäre, mit den Standard-Profilern, die Sie bereits benannt haben, zu bleiben, bis Sie die Quelle Ihrer Trauer lokalisieren und dann zu einer manuellen Technik wechseln oder Refactorings verwenden, um Teile der Methoden zu extrahieren, in denen der Hotspot enthalten ist klareres Verständnis, welcher Teil des Codes für unerwünschtes Verhalten verantwortlich ist.

Falls Sie Mikro-Benchmarks erstellen wollen: vergessen Sie es einfach. Mikro-Benchmarks zeigen fast nie verlässliche oder übertragbare Daten, selbst wenn Sie sie richtig und die Chancen sind sehr hoch, Sie bekommen sie überhaupt nicht richtig.

0

Sie können nützliche VTune Amplifier finden, die ein Profiler Java code analysis unterstützt. Sie können die Hotspots in Ihrem Java-Code und die Leistungsmesswerte sehen, die über Ihre Java-Quelldatei verteilt werden. Was wirklich wertvoll ist, ist, dass VTune Amplifier die genauen Stacks für reinen Java-Code und Java/C++ - Mixed-Mode-Code zeigt.