2008-10-01 9 views
4

De C#, est-il possible de détecter le nombre de changements de contexte qui se sont produits lors de l'exécution d'un bloc de code sur un thread particulier? Idéalement, j'aimerais savoir combien de fois et quelle CPU mon code de thread a été programmé.Comment détecter le nombre de changements de contexte qui se sont produits lors de l'exécution du code C#?

Je sais que je peux utiliser des outils comme Event Tracing for Windows et les visionneuses associées, mais cela m'a semblé un peu compliqué d'obtenir les données que je voulais.

De même, des outils tels que Process Explorer rendent trop difficile de déterminer le nombre de commutations générées par un bloc de code spécifique.

Contexte: Je suis en train de tester les performances réelles d'un faible niveau verrouillez primitive .NET (en raison de certains commentaires sur une récente blog post j'ai fait

Répondre

0

Il semble que procexp utilise peut-être les structures de données de thread du noyau (KTHREAD) ou de thread exécutif (ETHREAD) qui ont un champ ContextSwitches. Il pourrait être possible de l'obtenir à partir du code managé.

3

On dirait que vous soyez. Vous cherchez une solution programmatique, mais sinon, l'outil Process Explorer de Microsoft vous dira très facilement le nombre de changements de contexte pour un thread particulier

Une fois dans l'outil, double-cliquez sur votre processus, sélectionnez l'onglet Threads, et sélectionnez votre fil

L'onglet .NET contient des données de performances liées à .NET plus spécifiques.

+0

À droite, je cherche une solution plus programmatique puisque procexp ne me dira pas le nombre de commutations qui se sont produites dans un bloc spécifique. Ce serait trop difficile de tenir compte des chiffres du procexp. –

1

Je ne l'ai jamais fait, mais voici quelques pistes qui pourraient aider:

  1. L'API profileurs .NET peuvent vous permettre de connecter en? L'interface ICorProfilerCallback possède des rappels RuntimeThreadSuspended et RuntimeThreadResumed. Mais un commentaire sur this blog post semble indiquer qu'ils ne vous obtiendront pas ce que vous recherchez: "RuntimeThreadSuspended est émis lorsqu'un thread est suspendu par le moteur d'exécution, généralement en préparation d'un GC."

  2. Il existe un compteur de perfmon "Context Switches/sec" qui peut vous aider. Je n'ai pas regardé ce compteur spécifiquement, mais je devine qu'il fonctionne sur les threads Win32 et non sur les threads gérés. Vous pouvez utiliser les API de profilage pour obtenir l'ID de thread Win32 pour n'importe quel ID de thread géré donné.

Bonne chance! ;)

+0

Merci pour l'information! Je pense que la suspension est comme vous le dites (par exemple, le GC gèle un thread afin qu'il puisse réorganiser la mémoire) plutôt qu'un commutateur de contexte normal. J'ai regardé les commutateurs de contexte par seconde, mais je n'ai pas pu l'obtenir pour un seul bloc. Peut-être existe-t-il un moyen d'obtenir le val avant et après. –