2008-09-18 10 views
9

J'écris un jeu de dames simple en Java. Quand je souris sur la carte, mon processeur augmente jusqu'à 50% (100% sur un noyau).Java: Comment puis-je voir quelles parties de mon code fonctionnent le plus? (profilage)

Je voudrais savoir quelle partie de mon code (en supposant que ma faute) est en cours d'exécution pendant ce temps.

J'ai essayé le débogage, mais le débogage pas à pas ne fonctionne pas très bien dans ce cas.

Y at-il un outil qui peut me dire où se situe mon problème? J'utilise actuellement Eclipse.

+0

merci les gars! J'utilise eclipse btw – jjnguy

Répondre

2

Profilage? Je ne sais pas quel IDE vous utilisez, mais Eclipse has a decent proflier et il y a aussi une liste de certains profileurs open-source au java-source.

+0

Pourriez-vous écrire quelques conseils sur l'utilisation de TPTP? Ce serait de l'or! –

1

1) Il est de votre faute :)

2) Si vous utilisez Eclipse ou NetBeans, essayez d'utiliser les fonctionnalités de profilage - il devrait vous dire assez rapidement où votre code dépense beaucoup de temps. 3) à défaut, ajouter la sortie de la console où vous pensez que la boucle interne est - vous devriez pouvoir le trouver rapidement.

1

Oui, il existe de tels outils: vous devez profiler le code. Vous pouvez soit essayer TPTP en éclipse ou peut-être essayer JProfiler. Cela vous permettra de voir ce qui est appelé et à quelle fréquence.

3

Utilisez un profileur (yourkit par exemple)

0

Ou utiliser des cas de test JUnit et un outil de couverture de code pour certains composants communs de la vôtre. S'il existe des composants qui appellent d'autres composants, vous verrez rapidement ceux qui sont exécutés plusieurs fois. J'utilise Clover avec les cas de test JUnit, mais pour l'open-source, j'entends que EMMA est plutôt bon.

2

En un mot, profilers vous dira quelle partie de votre programme est appelée combien souvent.

Je ne profile pas beaucoup mes programmes, donc je n'ai pas trop d'expérience, mais j'ai joué avec le profileur NetBeans IDE quand je le testais. (J'utilise aussi Eclipse, et j'étudie également les fonctionnalités de profilage dans Eclipse.)

Le profileur NetBeans vous indiquera quel thread a été exécuté pendant combien de temps, et quelles méthodes ont été appelées depuis combien de temps. vous affichez des graphiques à barres pour montrer combien de temps chaque méthode a pris. Cela devrait vous donner un indice quant à la méthode qui cause des problèmes. Vous pouvez jeter un oeil à l'Java profiler que fournit l'EDI NetBeans, si vous êtes curieux.

Le profilage est une technique généralement utilisée pour mesurer quelles parties d'un programme prennent beaucoup de temps d'exécution, ce qui peut être utilisé pour évaluer si l'exécution d'optimisations serait bénéfique pour augmenter les performances d'un programme. programme.

Bonne chance!

1

Il s'agit généralement d'un problème de 'processeur élevé'.

Il existe deux types de hauts problèmes CPU

a) Lorsque le fil est en utilisant 100% CPU d'un noyau (Ceci est votre scénario)

b) l'utilisation du processeur est « anormalement élevée » lorsque nous exécuter certaines actions. Dans de tels cas, le CPU peut ne pas être 100% mais sera anormalement élevé. Typiquement cela se produit quand nous avons des opérations intensives de CPU dans le code comme l'analyse XML, la sérialisation de sérialisation etc.

Le cas (a) est facile à analyser. Lorsque vous rencontrez 100% des vidages de thread CPU 5-6 dans un intervalle de 30 secondes. Recherchez un thread qui est actif (dans l'état "runnable") et qui est dans la même méthode (vous pouvez en déduire en surveillant la pile de threads). Très probablement que vous verrez une « attente active » (voir le code ci-dessous pour un exemple)

while(true){ 
    if(status) break; 
    // Thread.sleep(60000); // such a statement would have avoided busy wait 
} 

Case (b) peuvent également être analysées à l'aide des décharges de fil prises dans l'intervalle égal. Si vous êtes chanceux, vous serez en mesure de trouver le code de problème, Si vous n'êtes pas en mesure d'identifier le code de problème en utilisant le vidage de thread. Vous devez recourir à des profileurs. Dans mon expérience, le profileur YourKit est très bon.

J'essaie toujours avec les vidages de threads en premier. Les profileurs ne seront que de dernier recours. Dans 80% des cas, nous serons en mesure d'identifier en utilisant des décharges de threads.

1

Si vous utilisez Sun Java 6, les versions JDK les plus récentes sont fournies avec JVisualVM dans le répertoire bin. Il s'agit d'un outil de surveillance et de profilage performant qui nécessitera très peu d'efforts - vous n'avez même pas besoin de démarrer votre programme avec des paramètres spéciaux - JVisualVM liste simplement tous les processus java en cours d'exécution et vous choisissez celui avec lequel vous voulez jouer .

Cet outil vous indiquera quelles méthodes utilisent toute la durée du processeur.

Il existe de nombreux outils plus puissants, mais vous devez d'abord jouer avec un outil gratuit. Ensuite, lorsque vous lirez sur les autres fonctionnalités disponibles, vous saurez comment ils pourraient vous aider.

0

En code monothread, je trouve l'ajout de quelques instructions comme ceci: System.out.println ("A:" + System.currentTimeMillis()); est plus simple et efficace que l'utilisation d'un profileur. Vous pouvez bientôt affiner la partie du code qui cause le problème.

+0

Son multi fileté. Mais je me souviendrai de cette astuce pour une autre fois. – jjnguy

Questions connexes