Est-il possible de lire le compteur de temps interne de la CPU à partir de C #?

J’ai un programme multithread C # où je dois enregistrer combien de ticks dépensent chaque thread dans un verrou d’attente spécifique.

Je sais qu’il existe des méthodes pour le faire à partir de C ou d’assembleur, mais est-il possible d’accéder au même compteur directement à partir de C #, c’est-à-dire sans passer par la classe Stopwatch les frais généraux, et je ne suis pas sûr de sa précision)?

Avant de “exclure” l’utilisation de System.Diagnostics.Stopwatch: votre système de test prend-il en charge le chronomètre haute résolution? : voir MSDN sur ‘StopWatch: check-out:’ Fréquence et ‘IsHighResolution .

Excellent fil de discussion sur comment tirer le meilleur parti de StopWatch: le fil de discussion SO ne manque pas les commentaires de Eric Lippert

Précision et exactitude dans la mesure du temps .net: SO Filet: Précision et exactitude dans la mesure du temps .NET peuvent être utiles.

“Coût” des appels d’API dans les API C # à Win32: QueryPerformanceFrequency et QueryPerformanceCounter: comparés à StopWatch?

Un exemple d’API de C # ici sur Codeproject: Code 2006, l’auteur dans un commentaire dit qu’il n’a pas pris en compte la sécurité des threads

D’autres discussions ici sur SO ont traité de problèmes tels que la compensation de l’impact unique du code géré par JIT (technique de préchauffage), le forçage de la récupération de place, et les finaliseurs, etc. Facile à trouver.

Examinez la classe StopWatch qui repose sur les API * QueryPerformance ** s’applique précisément à cette fin.

MSDN:

La classe Stopwatch facilite la manipulation des compteurs de performance liés au minutage dans le code géré. Plus précisément, le champ Fréquence et la méthode GetTimestamp peuvent être utilisés à la place des API Win32 non gérées, QueryPerformanceFrequency et QueryPerformanceCounter.

Les résultats recueillis par Kristof Verbiest méritent également un coup d’œil.