2017-09-29 1 views
1

J'essaie de profiler mon code pour détecter le goulot d'étranglement. J'ai cherché un profileur, mais je n'ai jamais trouvé ce que je cherchais.Profilage ligne par ligne Java

J'ai utilisé un python beaucoup dans le passé, et il y avait ce logiciel: line_profiler qui donne ce genre de retour:

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] 

Y at-il quelque chose similare dans le monde Java?

Merci pour la réponse.

p.s: Je connais déjà yourkit, jprofiler, visualwm, mais je veux quelque chose dans le code.

+0

Pourquoi le voulez-vous dans le code? La collecte des informations de profilage ralentira normalement votre application, vous aurez donc normalement besoin de l'exécuter à la demande et c'est comme ça que jprofiler fonctionne. – Thomas

Répondre

0

Je travaille sur l'analyse de performance depuis un certain temps et je suis presque sûr que vous ne trouverez pas un tel outil. Je ne pense pas, il est possible de construire un tel outil en premier lieu.

Il y a beaucoup d'impondérabilités impliquées dans celui-ci, par exemple, le hotspot-VM décompilera le code en apprenant des chemins d'exécution probables ou des fréquences d'exécution. Ainsi, le temps d'exécution d'une ligne de code peut varier de manière significative au fil du temps. De plus, votre solution de surveillance ralentira votre application et pire: elle modifiera les temps d'exécution relatifs de votre code. Cela signifie essentiellement que vous pourriez repérer un hotspot dans un endroit où aucun hotspot n'existerait sans votre surveillance.

Vous êtes libre de construire vous-même un tel outil, c'est-à-dire de mesurer les temps d'exécution via System.nanoTime(), mais vous découvrirez certainement que ce n'est pas un chemin à suivre. Ma suggestion serait de rester avec les profileurs par défaut que vous avez déjà nommés jusqu'à ce que vous localisiez la source de votre chagrin, puis passiez à une technique manuelle ou utilisiez des refactorings pour extraire des parties des méthodes dans lesquelles le hotspot est contenu pour obtenir un meilleure compréhension, quelle partie du code est responsable d'un comportement indésirable. Dans le cas où vous voulez construire des micro-benchmarks: il suffit de l'oublier. Les micro-benchmarks ne montrent presque jamais de données fiables ou transférables, même si vous les obtenez correctement et que les chances sont très élevées, vous ne les obtenez pas du tout.

0

Vous pouvez trouver un amplificateur VTune utile qui est un profileur prenant en charge Java code analysis. Vous pourrez voir les hotspots dans votre code Java et les métriques de performance distribuées via votre fichier source java. Ce qui est vraiment précieux, c'est que VTune Amplifier montre les piles précises pour le code Java pur et le code en mode mixte Java/C++.