Question

Je souhaite effectuer une analyse comparative d'un processus C #, mais je ne souhaite pas utiliser le temps comme vecteur - je souhaite compter le nombre d'instructions IL exécutées dans un appel de méthode donné. Est-ce possible?

Modifier Je ne parle pas d'analyse statique d'un corps de méthode. Je fais référence au nombre réel d'instructions exécutées. Ainsi, si, par exemple, le corps de la méthode inclut une boucle, le nombre serait augmenté de quelque manière que ce soit, mais la plupart des instructions constituent la boucle * le nombre d'itérations de la boucle.

Était-ce utile?

La solution

Je ne pense pas qu'il soit possible de faire ce que vous voulez. En effet, l’IL n’est utilisé que lors de la compilation JIT (Just-In-Time). Au moment où la méthode est en cours d'exécution, l'IL a été traduit en code machine natif. Ainsi, s’il est possible de compter le nombre d’instructions IL dans une méthode / un type / un assemblage statiques, il n’existe aucun concept de ce type au moment de l’exécution.

Vous n'avez pas indiqué votre intention en sachant le nombre d'instructions IL à interpréter. Étant donné qu’il n’ya qu’une faible corrélation entre le nombre de IL d’un corps de méthode et le nombre réel d’instructions de code machine, je ne vois pas ce que ce nombre permettrait de réaliser (à part satisfaire votre curiosité).

Autres conseils

Eh bien, ce ne sera pas facile. Je pense que vous pourriez instrumenter votre assemblage après la compilation avec un code de compteur de performances exécuté après des blocs de IL. Par exemple, si vous avez une section d'une méthode qui charge un int sur la pile, puis exécutez une méthode statique utilisant int dans le code optimisé, vous pouvez enregistrer un compte de 2 pour le chargement et l'appel int.

Même en utilisant des projets existants de lecture / écriture d'assemblys gérés / IL, ce serait une tâche assez ardue à mener à bien.

Bien sûr, certaines instructions enregistrées par votre compteur pourraient être optimisées lors de la compilation juste à temps en x86 / ia64 / x64, mais vous devrez courir un risque pour essayer de créer un profil basé sur une langue abstraite. comme IL.

Vous pouvez utiliser ICorDebug , qui possède une interface gérée. Définissez un point d'arrêt au début de la méthode et passez en revue le code jusqu'à ce qu'il quitte la méthode.

Cependant, je ne suis pas sûr de l’utilité de la métrique, les gens ont tendance à utiliser le temps pour ce genre de choses. Certaines instructions IL sont plus chères que d’autres.

J'utilise le Métrique du code . Ajouter au réflecteur

  

Le complément CodeMetrics analyse et   calcule plusieurs métriques de qualité de code   sur vos assemblées. Ce complément utilise   Réflecteur pour calculer les métriques classiques   tels que la complexité cyclomatique ou plus   simples tels que le   nombre de variables locales dans une méthode.   Tous les résultats peuvent être enregistrés dans un fichier.

Installez le plugin. Sélectionnez un ensemble et chargez les métriques de méthode. Il vous montrera une grille avec CodeSize, CyclomaticComplexity, # d’Instruction, etc.

Je sais que vous ne voulez pas le nombre statique. Cependant, le nombre de IL statique par arc, plus le nombre de fois que l'arc a été exécuté ensemble, vous donne le nombre de IL. Pour cela, vous devez instrumenter chaque arc, ce qui nécessite l’insertion d’un compteur.

(Un arc est une séquence d'instructions dans lesquelles vous ne pouvez pas entrer ou sortir. Si vous exécutez la première instruction, vous exécuterez toujours la dernière, etc.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top