Quel est le meilleur remplacement pour timeGetTime pour éviter wrap-around?
timeGetTime semble être tout à fait bon pour la requête de l'heure du système. Cependant, sa valeur de retour est de 32 bits uniquement, afin qu'il s'enroule autour de chaque 49 jours environ.
Il n'est pas trop difficile à détecter le roulement dans le code appelant, mais il ajoute une certaine complexité, et (pire) exige de tenir un état.
Est-il un remplacement pour timeGetTime qui n'aurait pas ce wrap-around problème (probablement en retournant une valeur 64 bits), et ont à peu près la même précision et le coût?
OriginalL'auteur Paweł Hajdan | 2010-05-13
Vous devez vous connecter pour publier un commentaire.
Nope, suivi de roll-over exige de l'état. Il peut être aussi simple que d'incrémenter votre propre compteur 64 bits sur chaque rappel.
Il est assez rare de vouloir suivre des périodes de temps d'une résolution aussi faible que 1 milliseconde jusqu'à 49 jours. Vous devriez vous inquiéter que la précision est toujours là, après une longue période. L'étape suivante consiste à utiliser l'horloge, GetTickCount(64), GetSystemTimeAsFileTime ont une résolution de 15,625 millisecondes et sont exacts avec un serveur de temps.
OriginalL'auteur Hans Passant
Quelle plate-forme?
Vous pouvez utiliser GetTickCount64() si vous utilisez Vista ou version ultérieure, ou de synthétiser votre propre
GetTickCount64()
deGetTickCount()
et une minuterie...Je traite avec le retournement problème dans
GetTickCount()
et à la synthèse d'unGetTickCount64()
sur les plates-formes qui ne supportent pas ici sur mon blog sur les tests de non-trivial code: http://www.lenholgate.com/blog/2008/04/practical-testing-17---a-whole-new-approach.htmlGetTickCount
ettimeGetTime
sont pas interchangeables. Elles ont toutes les deux millisecondes résolution, mais GetTickCount a seulement 10 à 16 ms précision, alors quetimeGetTime
a généralement de 1 à 5 ms précision.OriginalL'auteur Len Holgate
Sauf si vous avez besoin de temps un événement qui est de plus de 49 jours, vous pouvez ignorer le wrap-around. Seulement il suffit de soustraire la précédente timeGetTime() à partir de l'actuel timeGetTime() et vous toujours obtenir un delta de temps mesuré, précis, même sur de wrap-around -- à condition que vous êtes des événements de synchronisation dont la durée totale est de moins de 49 jours. Tout cela fonctionne en raison de la façon dont unsigned modulaire mathématiques fonctionne à l'intérieur de l'ordinateur.
ASTUCE: regardez dans TimeBeginPeriod(1L) pour augmenter la précision de timeGetTime().
MAIS... si vous voulez une version 64 bits de timeGetTime, elle est ici:
Veuillez noter que si cette fonction n'est pas appelée au moins une fois tous les 49 jours, que cette fonction ne parviennent pas à détecter correctement un wrap-around.
OriginalL'auteur Jerry Jongerius
Ont un coup d'oeil à GetSystemTimeAsFileTime(). Il remplit un
FILETIME
struct qui contient une valeur 64 bits représentant le nombre d'intervalles de 100 nanosecondes depuis le 1er janvier 1601 (UTC)"OriginalL'auteur Elrohir
Comment êtes-vous essayer de l'utiliser? J'utilise fréquemment le Win32 équivalent lors de la vérification des durées que je le sais, sera la moins de 49 jours. Par exemple, le code suivant fonctionne toujours.
Même si
timeGetTime
roulé sur tout en appelantDoSomthingThatTakesLessThen49Days
duration
sera toujours correct.Note le code suivant pourrait échouer sur roulement.
mais peut facilement être ré-écrite pour travailler comme suit
OriginalL'auteur Stephen Nutt
En supposant que vous pouvez garantir que cette fonction sera appelée au moins une fois tous les 49 jours, quelque chose de ce genre de travail:
Noter qu'en raison de l'utilisation de variables statiques, cette fonction n'est pas multithread-fort, donc si vous prévoyez sur l'appeler à partir de plusieurs threads, vous devriez sérialiser par l'intermédiaire d'une section critique ou d'un mutex ou similaire.
OriginalL'auteur Jeremy Friesner
Je ne sais pas si cela répond pleinement à vos besoins, mais
peut-être le long des lignes de ce que vous cherchez.
http://en.cppreference.com/w/cpp/chrono/system_clock
OriginalL'auteur dk123
Vous pouvez utiliser RDTSC intrinsèque. Pour obtenir le temps en millisecondes que vous pourriez obtenir de transformer coefficient:
Maintenant, vous pourriez obtenir nombre de millisecondes depuis la dernière remise à zéro:
Si votre système utilise SpeedStep ou d'autres technologies similaires, vous pouvez utiliser QueryPerformanceCounter/QueryPerformanceFrequency fonctions. Windows donne des garanties ensuite la fréquence ne peut pas changer tout le système est en cours d'exécution.
Vrai, pour SpeedStep systèmes, cela ne fonctionnera pas. Mise à jour de ma réponse.
OriginalL'auteur Kirill V. Lyadvinsky