6
votes

Stopwatch.getMestamp est-il jamais surveillé? Ou rouler?

In Utilisation STOPWATCH.GETTMESTAMP () Nous constatons que si vous enregistrez la valeur de retour, puis continuez à l'appeler et à comparer la valeur de retour précédente, elle sera éventuellement sauvegarder une valeur inférieure à l'original.

est ce comportement attendu?

Le fait de le faire dans le code de production consiste à avoir un temps de Sytem précis microsecond.

La technique consiste à appeler denttime.utcnow et appelant également stopwatch.getimeStamp () comme originalUtCnow et originalTimeStamp, respectivement.

à partir de ce point vers l'avant, l'application appelle simplement STOPWatch.getMestamp () et à l'aide de chronomètre.frequency Ça calcule la différence de la variable d'origineTimestamp, puis ajoute cette différence à l'originalTcnow.

ALORS, TOILA ... une date d'heure microseconde efficace et précise.

Mais, nous constatons que parfois le stopwatch.getMestamp () retournera un nombre inférieur.

Cela arrive assez rarement. Notre pensée est de simplement "réinitialiser" quand cela se produit et continue.

Cependant, cela nous fait douter de la précision du stopwatch.getimeStamp () ou du suspect Il existe un bogue dans la bibliothèque .NET.

Si vous pouvez perdre une lumière sur cela, veuillez faire.

FYI, basé sur la valeur de l'horodatage actuelle, la fréquence et le long.MAXValue, il semble peu probable qu'il va surmonter au cours de notre vie à moins que ce soit une question matérielle.

Edit: Nous calculons maintenant cette valeur "par thread" puis "serrer la serrage" pour surveiller les sauts entre les noyaux pour le réinitialiser.


4 commentaires

Comment pouvez-vous avoir un "temps système précis microsecond" lorsque utcnow n'est pas précis de microseconde? Ce numéro ne peut être utilisé que pour le moment précis des intervalles.


Pardon. Avez-vous lu mon explication? Il appelle uniquement utcnow une fois au début de l'application. À partir de ce moment-là, il utilise l'horloge système et calcule la différence pour obtenir l'heure actuelle.


Chronomètre utilise les minuteries haute résolution lorsqu'il y a accès ou existent sur l'ordinateur.


Acquérir des timbres de haute résolution a une description détaillée Sur le compteur haute performance Hyestamp, avec des illustrations et une FAQ.


4 Réponses :


6
votes

Il est possible que vous obteniez le saut à temps car votre fil saute des cœurs. Voir la "note" sur cette page: http://msdn.microsoft.com/ EN-US / Bibliothèque / EBF7Z0SW.ASPX


5 commentaires

Merci! Ceci suit la logique car il s'agit d'une application multi-threadée. Et votre lien donne une confirmation qu'un problème de matériel et de bios peut causer cela. Je vous donne un crédit pour la réponse. Toute suggestion sur la façon de traiter cela? Nous gardons simplement "LastClockTime" et comparer, c'est que c'est moins que nous réinitialisons.


@Wayne: Environnement.TickCount apparemment ne souffre pas de ce problème, mais il est moins précis et déborde moins d'un mois.


Nous avons déjà souffert du débordement. C'était douloureux. Et c'est trop moins précis pour nos besoins. Merci d'avoir offert, de toute façon.


@Groo 1) Êtes-vous sûr? 2) Quelle est la précision? Est-ce 1 ms? Ou 15.6ms? (Sauf si vous augmentez la résolution de la minuterie)


@Eugen: Non, je me suis trompé de commenter cela. Environnement.TickCount a une résolution de ~ 16ms, le seul moyen d'obtenir une meilleure résolution est d'utiliser un QueryPerformCOnter (ou chronomètre qui utilise Ceci sous le capot, à condition que les compteurs élevés soient disponibles sur ce système).



2
votes

Le comportement de la classe de chronomètre variera d'un système au système en fonction du support matériel.

Voir: http://msdn.microsoft. com / fr-nous / bibliothèque / system.diagnostics.stopwatch.ishighresolution.aspx

En outre, je crois que l'appel de Win32 équivalent sous-jacent ( QueryPerformCounter ) contient une documentation utile: http://msdn.microsoft.com/en-us/library/windows/desktop/ms644904 (v = vs.85) .aspx


0 commentaires

1
votes

Je ne sais pas exactement en ce qui concerne la course à l'envers (ce qui semble être un petit changement de petit à l'envers), mais je l'ai déjà expérimenté trois fois que la valeur de stopwatch.getimetamp () peut changer si énormément que cela provoque des exceptions de trop-plein dans certains autres calculs de forme sur comme suit: de
(Stopwatch.getimetamp () - ProgramStartStopWatchTimetamp) * N
n est une valeur importante, mais suffisamment petite que si le chronomètre ne saute pas énormément, le programme pourrait faire fonctionner des années sans avoir une exception de débordement. Notez également que ces exceptions ont eu lieu de nombreuses heures après le démarrage du programme, le problème n'est donc pas seulement que le chronomètre a couru à l'envers un peu immédiatement après le début. Il a juste sauté à une gamme totalement différente, dans la direction.

En ce qui concerne les chronomètres rouler, dans l'un des cas ci-dessus, il (pas la différence, mais chronomètre) a obtenu la valeur de quelque chose d'un la 0xFF4? ???? ???? ????, il a donc sauté à une plage qui était très proche de rouler. Après avoir redémarré le programme plusieurs fois, cette nouvelle gamme était toujours toujours en vise. Si cela importe plus compte tenu de la nécessité de gérer les sauts de toute façon ...

S'il était également nécessaire de déterminer quel essentiel l'horodatage a été pris à ce moment-là, il est probablement utile de connaître le numéro de base exécutant. Pour cette fin, il existe des fonctions appelées getcurrentProcessornumber (disponible depuis le serveur 2003 et Vista) et getCurrentProcessornumberex (disponible depuis le serveur 2008 R2 et Windows 7). Voir aussi Réponses de cette question Pour plus d'options (y compris Windows XP).
Notez que le numéro de base peut être modifié par le planificateur à tout moment. Mais quand on lit le numéro de base avant de lire chronomètre horodatage, et après, et que le numéro de base est resté identique, peut-être peut-être supposer que la lecture de chronomètre a également été effectuée sur ce noyau ...


0 commentaires

0
votes

Pour répondre spécifiquement à la question de haut niveau "À quelle fréquence stopwatch.getimetamp () roule sur?", La réponse de Microsoft est la suivante:

Pas moins de 100 ans à compter de la dernière botte du système, et potentiellement plus longtemps sur la minuterie matérielle sous-jacente utilisée. Pour la plupart des applications, le renversement n'est pas une préoccupation.


0 commentaires