2012-02-14 3 views
13

Comme nous le savons tous le chronomètre pourrait avoir des problèmes dans une application asynchrone multithread qui sera en cours d'exécution sur tous les cœurs. Sur un ordinateur multiprocesseur, le processeur sur lequel le thread s'exécute n'a pas d'importance. Cependant, en raison de bogues dans le BIOS ou la couche d'abstraction matérielle (HAL), vous pouvez obtenir différents résultats de synchronisation sur différents processeurs. Pour spécifier l'affinité du processeur pour un thread, utilisez la méthode ProcessThread.ProcessorAffinity. Y at-il un moyen pour moi d'obtenir des valeurs de type tick/timestamp fiables qui ont une haute résolution/précision et qui sont cohérentes entre les cœurs de processeurs?Multicore et thread. Chronomètre .Net?

S'il n'est pas possible de sécuriser le chronomètre (QueryPerformanceCounter), quelle est la meilleure façon d'obtenir un bon horodatage sur les cœurs? DateTime.UtcNow.Ticks ou Environnement.TickCount? D'autres compteurs?

J'ai besoin d'une meilleure résolution que ce que DateTime.UtcNow.Ticks peut fournir. (10-15ms)

Répondre

7

J'ai cherché moi-même une réponse à ce problème spécifique et le meilleur que j'ai vu est DateTime.UtcNow. Il semblerait qu'il n'y ait aucune haute résolution exposée de Windows et fiable compteur (j'ai googlé pour un pour des âges et n'ai toujours pas rencontré n'importe).

+0

exemple de code d'utilisation? –

5

En fait, selon le official documentation, après Windows XP, il devrait être très bien d'utiliser StopWatch/QueryPerformanceCounter sur les systèmes multiprocesseurs. Si le système ne prend pas en charge TSC invariant, QPC utilisera automatiquement une stratégie de temporisation différente.

Notez cependant la section des commentaires pour les systèmes virtualisés. Il semble que vous devez faire attention dans ce cas précis.