Tout recommandé Java profilage tutoriel?
Est-il recommandé d'applications Java profilage tutoriel?
Je suis maintenant en utilisant JProfiler et Eclipse Test & Outils de Performance de la Plateforme (TPTP) avec mon profilage. Cependant, bien équipé avec une magnifique armes, comme quelqu'un de nouveau à nouveau en Java de profilage, il me manque encore la théorie générale et les compétences pour mettre en lumière le goulot d'étranglement.
Vous devez vous connecter pour publier un commentaire.
Le profilage est un sujet d'avoir plus qu'une école de pensée.
La plus populaire est que vous passez en obtenir mesures. Qui est, vous essayez de voir combien de temps chaque fonction et/ou combien de fois il est appelé. Clairement, si une fonction prend très peu de temps, puis accélérer pour gagner peu. Mais si elle prend beaucoup de temps, alors vous avez à faire un travail de détective pour comprendre ce que la partie de la fonction est chargé pour le moment. N'attendez pas de fonction de temps pour ajouter un maximum de temps, parce que les fonctions s'appellent les uns les autres, et la raison d'Une fonction peut prendre beaucoup de temps, c'est qu'il appelle la fonction B qui prend également beaucoup de temps.
Cette approche peut trouver beaucoup de problèmes, mais il dépend de vous d'être un bon détective et d'être capable de penser clairement les différents types de temps, comme l'horloge de mur du temps et de temps CPU, et de l'auto-temps contre le temps d'inclusion. Par exemple, une application peut paraître lente, mais la fonction peut être tous signalés en tant que proche de zéro. Cela peut être causé par le programme I/O bound. Si le I/O est quelque chose que vous attendez, que peut-être bien, mais il peut faire un peu d'e/S que vous ne savez pas à propos, et puis vous êtes de retour à un travail de détective.
Attente générale avec les profileurs, c'est que si vous pouvez corriger suffisamment de choses pour obtenir un 10% ou 20% de l'accélération, c'est assez bon, et je n'ai jamais entendu des histoires de profileurs être utilisé à plusieurs reprises pour obtenir la vitesse de beaucoup plus que cela.
Une autre approche est de ne pas mesurer, mais à capture. Il est basé sur l'idée que, pendant un temps, lorsque le programme est plus long (dans l'horloge murale) que vous le souhaitez, vous voulez savoir ce qu'il fait, principalement, et une façon de le savoir est de l'arrêter et de demander, ou de prendre un instantané de son état et de l'analyser pour comprendre complètement ce qu'il fait et pourquoi il le fait à ce moment précis dans le temps. Si vous faites cela plusieurs fois et vous voyez quelque chose qu'il est en train de faire à plusieurs reprises, alors que l'activité est quelque chose que vous pourriez optimiser de manière fructueuse. La différence est que vous ne demandez pas combien; vous demandez ce et pourquoi. Voici une autre explication. (Notez que la vitesse de prendre un instantané n'a pas d'importance, parce que vous ne lui demandez pas sur le temps, vous demandez à ce que le programme est en train de faire et pourquoi.)
Dans le cas de Java, voici un low-tech, mais très efficace façon de le faire, ou vous pouvez utiliser le bouton "pause" dans Eclipse. Un autre moyen est d'utiliser un type particulier de profiler, que des échantillons de l'ensemble de la pile d'appel, sur l'horloge murale (pas de CPU, sauf si vous voulez être aveugle pour I/O), quand vous le voulez à l'échantillon (par exemple, lors de l'attente pour la saisie de l'utilisateur), et résume au niveau des lignes de code, pas seulement au niveau des fonctions, et le pourcentage de temps, pas de temps absolu. Pour obtenir pour cent du temps, il devrait vous dire, pour chaque ligne de code qui s'affiche sur tout l'échantillon, le pourcentage d'échantillons contenant cette ligne, parce que si vous pouvez faire que la ligne d'aller plus loin, vous permettrait d'économiser que pour cent. (Vous devez ignorer d'autres choses, il essaie de vous parler, comme les graphes d'appels, la récursivité, et de temps à soi.) Il y a très peu de profileurs qui répondent à ce cahier des charges, mais on est RotateRight/Zoom, mais je ne suis pas sûr si cela fonctionne avec Java, et il peut y en avoir d'autres.
Dans certains cas, il peut être difficile d'obtenir des échantillons de la pile quand vous le souhaitez, pendant le temps de réel de la lenteur. Ensuite, à partir de ce que vous êtes après est des pourcentages, vous pouvez faire quelque chose pour le code qui rend plus facile d'obtenir des échantillons sans modifier les pourcentages. Une façon est de amplifier le code en l'enveloppant d'un temporaire boucle autour de, disons, 100 itérations. Une autre façon est, sous un débogueur, pour définir un changement de point d'arrêt. Ce qui fera que le code soit interprété de 10 à 100 fois plus lent que la normale. Un autre moyen est d'utiliser un réveil timer pour aller au cours de la période de la lenteur, et utilisez-la pour copier un échantillon.
Avec la capture de la technique, si vous l'utilisez à plusieurs reprises pour trouver et exécuter plusieurs optimisations, vous pouvez vous attendre à atteindre près de performance optimaux. Dans le cas de gros logiciels, où les goulots d'étranglement sont de plus en plus nombreux, cela peut signifier substantielle facteurs. Les gens sur Pile Overflow ont signalé des facteurs de 7x à 60x. Voici un exemple détaillé de 43x.
La capture de la technique a de la difficulté avec les cas où il est difficile de comprendre pourquoi les threads sont en attente alors qu'ils sont, comme lors de l'attente pour une transaction sur un autre processeur. (Mesure a le même problème.) Dans ces cas, j'utilise une méthode laborieuse de la fusion horodaté des journaux.
Je suis en utilisant Yourkit Java Profiler 11.0 et qu'il est très bon pour l'optimisation de la mémoire et de la surveillance du temps de calcul.
Aussi la yourkit site dispose d'une bonne base de connaissances et les rubriques d'aide.
En tant que nouveau venu de profilage, vous devriez commencer par simplement à la recherche pour les méthodes qui ont un long temps d'exécution et/ou sont appelés à de nombreuses reprises pendant l'utilisation normale des modèles/où les goulots d'étranglement se produisent.
Je ne suis pas sûr de savoir comment l'intégration Eclipse avec JProfiler fonctionne, puisque j'ai d'abord utiliser NetBeans. Cependant, dans NetBeans, il est un "Instantané" de la vue qui montre une hiérarchie des invocations de méthode avec runtimes cette somme jusqu'à 100%. Je regarde pour les parties de la hiérarchie d'un (relativement) grand % de la durée totale. À partir de là, vous avez à penser à ce que ces méthodes sont en train de faire, et ce qui pourrait être à l'origine de leur lente.
Par exemple: j'ai remarqué qu'une méthode qui a été appelé fréquemment dans son ensemble en prenant beaucoup trop de temps à remplir, et a été un sérieux goulot d'étranglement. Longue histoire courte, il s'avère que le code a été de vérifier pour voir si un élément est présent dans une collection à l'aide de la
.contains()
méthode, et la collection a été d'une Liste Liée. La raison de ce problème est que les Listes Liées avoir le temps de la complexité de O(n) pour des fonctions comme.contains()
. La solution dans ce cas est très simple, comme j'ai été en mesure de remplacer la Liste Liée à un Ensemble de Hachage, qui effectue.contains()
beaucoup plus rapide, en O(1) fois.JProfiler est livré avec son manuel d'aide. J'ai trouvé que c'était très bon.
Vous pouvez trouver le livre de Java Plate-forme de Performance intéressant. Publié par Sun Microsystems.