2009-07-07 8 views
5

J'ai utilisé Yourkit 8.0 pour profiler une application mathématiquement intensive fonctionnant sous Mac OS X (10.5.7, Apple JDK 1.6.0_06-b06-57), et j'ai remarqué des étranges comportement dans les résultats de profilage du processeur. Par exemple - J'ai effectué une analyse de profilage en utilisant l'échantillonnage, qui a indiqué que 40% du temps d'exécution de 10 minutes de l'application était passé dans la méthode StrictMath.atan. J'ai trouvé cela déroutant, mais je l'ai pris à son mot et a passé un peu de temps en remplaçant atan avec un ajustement polynomial extrêmement simple. Lorsque j'ai réexécuté l'application, cela a pris presque exactement la même durée qu'avant (10 minutes) - mais mon remplacement atan ne s'est révélé nulle part dans les résultats de profilage. Au lieu de cela, les pourcentages d'exécution des autres hotspots majeurs ont simplement augmenté pour compenser.Profiling méthodes natives en Java - résultats étranges

Pour résumer:

RESULTATS AVEC StrictMath.atan (méthode native)
d'exécution Total: 10 minutes
Méthode 1: 20%
Méthode 2: 20%
Méthode 3: 20%
StrictMath.atan: 40%

RÉSULTATS AVEC Java simplifiée, pur atan
Durée d'exécution totale: 10 minu tes
Méthode 1: 33%
Méthode 2: 33%
Méthode 3: 33%

(Méthodes 1,2,3 ne pas effectuer des appels atan)

Toute idée est avec ce comportement? J'ai obtenu les mêmes résultats en utilisant JProfiler d'EJ-Technologies. Il semble que l'API de profilage JDK signale des résultats inexacts pour les méthodes natives, au moins sous OS X.

+0

Je ne serais pas surpris si 'atan' était intrinsèque - au lieu d'appeler une méthode, le code machine équivalent est injecté en ligne. –

+0

Je l'ai expérimenté aussi avec différentes méthodes dans StrictMath sur Mac OS X 10.7 (et versions antérieures aussi). –

+0

Alors, y a-t-il une solution à ce problème? – ziggystar

Répondre

3

Cela peut se produire en raison des incohérences de la prise d'échantillons. Ainsi, par exemple, si une méthode utilise une bonne quantité de temps, mais ne prend pas beaucoup de temps à s'exécuter, il est possible que l'échantillonnage la rate. En outre, je pense que la collecte de place ne se produit jamais pendant un échantillon, mais si du code cause beaucoup de récupération de place, cela peut grandement contribuer à un ralentissement sans apparaître dans l'échantillon.

Dans une situation similaire, j'ai trouvé très utile de lancer deux fois, une fois avec le traçage et une fois avec l'échantillonnage. Si une méthode apparaît dans les deux, elle utilise probablement beaucoup de CPU, sinon elle pourrait bien être un artefact du processus d'échantillonnage.

0

Je trouve YourKit grandement exagérer le coût d'appel des sous-méthodes (en raison de sa méthode de journalisation, je suppose). Si vous suivez seulement les conseils que le profil vous donne, vous finirez par fusionner des fonctions sans gain réel, car le HotSpot le fait généralement très bien. Par conséquent, je conseillerais fortement de tester des lots complètement à l'extérieur des profileurs, pour avoir une meilleure idée si les changements sont vraiment bénéfiques (cela peut sembler évident mais cela m'a coûté du temps de développement).

0

Depuis que vous utilisez un Mac, vous pouvez essayer Apple's Shark profiler (téléchargement gratuit de ADC) qui a le support de Java et le groupe de performance d'Apple a mis beaucoup de temps dans l'outil.Comme Nick l'a souligné, l'échantillonnage peut être trompeur si l'intervalle d'échantillonnage est suffisamment proche du temps d'exécution de la fonction et que le profileur vérifie rarement quand la fonction est en cours d'exécution. Je ne sais pas si YourKit supporte cela mais dans Shark vous pouvez changer l'intervalle d'échantillonnage à autre chose que les 10ms par défaut et voir si les résultats sont sensiblement différents. Il existe également un mode de traçage d'appel séparé qui enregistrera chaque fonction entrée/retour - cela évite complètement la possibilité d'erreurs d'alias, mais recueille une tonne de données et un surcoût plus important, ce qui pourrait avoir une incidence sur votre application. En traitement.

0

Vous pouvez examiner les paramètres transmis dans les trois méthodes. Il se peut que le temps soit passé à générer des valeurs de retour ou des méthodes qui créent beaucoup d'objets temporaires.

-1

Les profileurs peuvent être comme ça.

This is the method I use.

fonctionne à chaque fois.

And this is why.

+0

Comme pour expliquer pourquoi cela conduit à des résultats différents de ceux d'un profileur d'échantillonnage qui automatise ce processus? – ziggystar

+0

@ziggystar: Certains profileurs d'échantillonnage automatisent la moitié du processus, c'est-à-dire ceux qui échantillonnent la pile entière, sur le temps de l'horloge murale (pas CPU). La moitié du processus qu'ils n'automatisent pas est la découverte des problèmes de performances que vous pouvez résoudre. Si un énoncé ou une fonction a un% inclusif, alors le problème est ailleurs, mais cela ne limite pas le problème. Le simple fait de savoir qu'une ligne de code, une fonction ou un "chemin" est "chaud" ne vous dit pas grand-chose. C'est plus révélateur si vous pouvez examiner des échantillons représentatifs spécifiques, dans leur intégralité. ... –

+0

@ziggystar: ... Le résultat différent qui en résulte est que vous trouvez des accélérations que vous ne trouverez pas avec un très bon profileur. Lorsque vous réparez ces problèmes et que vous répétez le processus, les problèmes qui étaient petits auparavant sont maintenant un pourcentage plus élevé car le programme prend moins de temps. Donc, un par un, vous les corrigez, et l'accélération composée peut être surprenante. Combien d'accélération avez-vous jamais eu avec un profileur? Si la réponse est supérieure à 40%, cela me surprendrait. –

0

Il convient de noter que les méthodes Java peuvent être inline si elles sont assez petites, mais les méthodes natives sont inline selon des règles différentes. Si une méthode est en ligne elle n'apparaît pas dans le profileur (certainement pas YourKit de toute façon)

Questions connexes