Je me demande quelle est la précision de la classe de minuterie dans System.Timers, car c'est un double (ce qui semblerait indiquer que vous pouvez avoir des fractions de millisecondes). Qu'est-ce que c'est? P>
6 Réponses :
Windows Desktop Oses n'est vraiment pas précis au-dessous de 40 ms. Le système d'exploitation n'est tout simplement pas une heure en temps réel et présente donc une importante gigue non déterministe. Cela signifie que, même s'il peut signaler des valeurs à la milliseconde ou même plus petite, vous ne pouvez pas vraiment compter sur ces valeurs pour être vraiment significatif. Donc même si em> l'intervalle de minuterie est défini sur une valeur de sous-milliseconde, vous ne pouvez pas compter sur des heures entre le réglage et la cuisson pour être réellement ce que vous avez dit que vous vouliez. P>
Ajouter à ce fait que l'ensemble du cadre que vous exécuté sous est non déterministe (le GC pourrait vous suspendre et faire la collecte duing le moment où la minuterie devrait tirer) et vous finirez par des charges et des charges de risque en essayant de faire tout ce qui est le temps critique. p>
Ce n'est pas particulièrement critique; J'écris un "processeur virtuel" pour un jeu de simulation de robot qui utilise une minuterie pour exécuter des instructions à une vitesse spécifiée et je me demande simplement à quel point je peux la définir.
Je n'essaierais pas d'aller plus fréquent que 1 ms. Le planificateur du système d'exploitation ne fera rien de plus fréquent que celui de votre application.
System.Timers.Timer est bizarre. Il utilise un double comme intervalle, mais appelle en fait maths.Ceuil sur elle et jette le résultat comme INT à utiliser avec un système sous-jacent.Trreading.Timer. La précision théorique est alors 1ms et vous ne pouvez pas spécifier un intervalle supérieur à 2 147 483,647MS. Compte tenu de cette information, je ne sais vraiment pas pourquoi un double est utilisé comme paramètre d'intervalle. P>
Il y a quelques années, j'ai trouvé qu'il était précis à environ 16 ms ... mais je ne me souviens malheureusement pas des détails. P>
Ce sera 15.625ms == 64Hz, la fréquence de l'horloge système.
Vous pouvez la découvrir facilement par vous-même en effectuant une boucle qui échantillonne constamment la durée de temps résultante et vérifiez ce qu'est la granularité IT étapes. P>
J'ai comparé system.timers.timer code> et
system.threading.timer code> - les deux donnent des erreurs systématiques autour de 8..16 ms, en particulier sur de petits intervalles (1000 ..6000 ms). Chaque appel de routine de la minuterie ultérieure s'est produit avec une intervalle accrue du premier appel. Par exemple, la minuterie avec intervalle de 2000 ms se déclenche en 2000, 4012, 6024, 8036, 10048 millisecondes et ainsi de suite (horodatées obtenues à partir de
environnement.TickCount code> et
stopwatch.elapsedTicks code>, les deux donner les mêmes résultats). P>
La résolution de la minuterie diminue dans le régime de 1 ms sans aucun effort de mise en œuvre.
Je viens de décrire la raison du Voir la réponse liée pour en savoir plus sur les détails. P> Double code> Precision dans Cette réponse .
Lors de la configuration du système A à exécuter à 1024 interruptions par seconde (à l'aide de l'API de la minuterie multimédia), le temps entre les interruptions entre 0,9765625 ms. La résolution standard pour les questions de chronométrage est de 100ns. Ces valeurs sont stockées comme entiers. La valeur 0.9765625 ne peut pas être stockée
Sans perdre de précision dans un entier à la résolution de 100 ns. Le dernier chiffre (5) représente
500 ps. Ainsi, la résolution doit être supérieure à trois ordres de grandeur. Stocker ces temps
Les valeurs dans les entiers avec une résolution de 100 PS sont sans espoir car un entier de 8 octets à 100 PS résolde envelopperait l'afours d'environ 21350 jours ou environ 58 ans. Cette période est trop courte pour être acceptée par quiconque (rappelez-vous le scénario Y2K!). P>