2010-11-12 6 views
2

J'ai une application où l'utilisateur peut connecter des nœuds ensemble pour effectuer des calculs en temps réel. Je voudrais pouvoir montrer à l'utilisateur un pourcentage d'utilisation du processeur pour montrer combien de temps CPU est utilisé, et une panne par nœud pour pouvoir repérer les zones problématiques.C#: profilage de code d'exécution - toutes les bibliothèques existantes?

Existe-t-il des implémentations open source disponibles pour un profileur d'exécution comme celui-ci? Je peux écrire mon propre en utilisant System.Diagnostics.Process.TotalProcessorTime, chronomètres/performancecounters, mais je préfère aller avec quelque chose essayé & testé qui pourrait peut-être m'offrir des informations plus détaillées plus tard si possible.

Modifier: Je ne recherche pas de profileur autonome puisque je veux afficher les statistiques en temps réel dans l'interface de mon application.

+0

Il semble que vous vouliez simplement utiliser l'unité centrale par machine ou processus, et non pas une méthode détaillée par défaut telle que fournie par un profileur de code. –

+0

Je veux l'utilisation totale du processeur en% et le% par nœud de calcul. Donc, obtenir le compteur de performance sur calcul-start et -end par nœud devrait suffire en ce moment, mais plus tard, je pourrais vouloir ajouter plus d'informations approfondies sur l'évolution du temps CPU. – Pygmy

+0

Il suffit d'afficher 100%. Si c'est moins, il y a un problème avec votre code. –

Répondre

1

Vous pouvez essayer le profileur commercial GlowCode qui a une telle fonctionnalité.

Ou open source SlimTune, mais il est encore en version bêta.

+0

C'est génial en tant que profileur autonome, mais je veux faire le profilage dans l'application elle-même pour montrer les statistiques en temps réel à l'utilisateur dans l'interface utilisateur de l'application. – Pygmy

+1

++ Bienvenue à SO! –

0

Je suppose que vous exécutez une minuterie, comme disent 10 calculs par seconde, car sinon vous utilisez simplement 100% du processeur (sauf si vous faites aussi des E/S). Pouvez-vous régler une alarme de réveil pour qu'elle se déclenche à une fréquence raisonnable, comme 10 ou 100 Hz, indépendamment de tout ce que fait le programme, et surtout pendant les E/S ou d'autres temps bloqués?

Ensuite, pour chaque bloc, tenez compte du nombre de fois où les 100 dernières interruptions ont été actives. C'est votre pourcentage, et le coût de l'acquisition est minime.

Est-ce que les blocs s'appellent les uns les autres comme des sous-programmes? Dans ce cas, à chaque interruption, vous pouvez capturer la pile d'appels parmi les blocs, et un bloc est "actif" s'il se trouve quelque part sur la pile, et "crunch" s'il est à la fin de la pile (pas en train d'appeler un autre bloc, et pas dans I/O). Ensuite, vous avez le choix sur chaque bloc d'indiquer le pourcentage de temps "crunching" (qui ne dépassera pas 100% en cas de sommation) ou "active" (qui dépassera probablement 100% en cas de sommation sur des blocs).

La valeur de ce dernier nombre est qu'il ne vous dit pas tellement "où" le temps est passé, il vous dit "pourquoi". Cela peut répondre à des questions comme "Je vois que foo prend beaucoup de temps, mais comment ai-je obtenu ?" Idem pour les E/S. C'est un processus aussi, il a juste lieu sur d'autres matériels. Vous ne voulez pas l'ignorer, car si vous le faites, vous pourriez finir par dire "Comment se fait-il que j'utilise seulement une petite fraction du CPU?"

+0

Je ne suis pas à court de minuterie, je calcule et restitue des choses ce qui signifie que je suis lié par le rafraîchissement vertical du moniteur, et d'autres choses prennent du temps aussi (GPU par exemple). – Pygmy

+0

@IUsedToBeAPygmy: OK, c'est une bonne minuterie. –

+0

@IUsedToBeAPygmy: Notez que même si votre timer/vsync s'exécute à un débit élevé, le taux de prélèvement des échantillons de pile n'a pas besoin d'être élevé. Il suffit d'être décorrélé avec l'autre. –

Questions connexes