Tout d'abord, vous devez réaliser que il est extrêmement difficile, voire impossible, de faire la synchronisation exacte sur un ordinateur en raison des limitations exposées à la fois par le matériel et le logiciel. La bonne nouvelle est que ce genre de précision est rarement nécessaire. Dix ticks est un incroyablement petit quantité de temps. Très peu de travail est fait par le processeur dans cet intervalle, et il ne sera jamais statistiquement significatif. Pour référence, l'horloge Windows a une précision d'environ 10 millisecondes (moins sur les versions antérieures). Envelopper votre code avec des appels au DateTime.UtcNow
ne va pas faire mieux que ça.
Dans votre question, vous parlez de vouloir «élever un événement». Le problème est que le seul type d'objet de chronométrage qui déclenche un événement à des intervalles spécifiques est l'objet Timer
. Il est disponible en 3 versions différentes dans le .NET Framework (System.Timers.Timer
, System.Threading.Timer
et System.Windows.Forms.Timer
), tous ayant leurs propres scénarios d'utilisation et leurs particularités, mais aucun ne garantit une précision proche de ce que vous demandez . Ils ne sont même pas conçus pour le faire, et il n'y a pas non plus de fonctions équivalentes exposées par l'API Windows qui fourniront ce type de précision.
La raison pour laquelle j'ai demandé pourquoi vous vouliez faire cela et si vous essayez de benchmark, c'est parce que cela change tout le jeu. Le .NET Framework (à partir de la version 2.0) fournit un Stopwatch
object expressément conçu pour mesurer avec précision le temps écoulé pour une situation telle que l'analyse comparative ou le profilage des performances. Le Stopwatch
enveloppe simplement les fonctions Windows API QueryPerformanceFrequency
et QueryPerformanceCounter
(ce qui devrait confirmer ma suggestion quant à son utilisation prévue). Nous avions l'habitude de P/Invoke ces fonctions pour accéder à ce type de fonctionnalité dans les versions antérieures du Framework, mais il est maintenant intégré. Si vous avez besoin d'un timer avec une résolution relativement élevée pour le benchmarking, le Stopwatch
est votre meilleur pari . En théorie, il peut vous fournir un timing inférieur à la microseconde.
Mais ce n'est pas sans problèmes. Cela ne déclenche aucun événement, donc si votre conception actuelle repose sur la gestion d'événements, vous devrez la repenser. Et, il n'est pas garanti d'être parfaitement précis non plus. Bien sûr, il peut avoir la résolution la plus élevée possible en raison de contraintes matérielles, mais cela ne veut pas dire nécessairement qu'il sera conforme à vos exigences. Par exemple, il peut ne pas être fiable sur un système à plusieurs processeurs où Start
et Stop
doivent être exécutés sur le même processeur. Cela ne devrait pas avoir d'importance, mais it does. C'est aussi subject to being unreliable sur les processeurs qui peuvent réduire leur vitesse d'horloge de haut en bas. Et oserais même mentionner que l'appel à QueryPerformanceCounter
lui-même va prendre un certain temps-environ 5 microsecondes même sur un processeur moderne de 2+ GHz, ce qui vous empêche d'être en mesure d'atteindre ce moment sous-microseconde qui semblait bien en théorie. Là encore, tout profileur de code raisonnable considérerait cette quantité de temps négligeable parce que, bien, c'est.
(Voir aussi: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)
Pourquoi dans le monde voudriez-vous élever un événement toutes les onze ticks? Utilisez-vous ceci pour le profilage de code? –
Vous ne répondez pas aux questions. 11 tick est juste un exemple. tout ce que je veux, c'est une minuterie haute résolution. si possible, jusqu'à 1 tick. et oui, je développe une application pour faire un benchmark. –
C'est pourquoi je supporte les commentaires downvoting –