timespec équivalent pour windows
Je suis le portage de mon application windows
de unix
et j'ai couru dans un mur. Dans mon application, j'ai besoin de trouver du temps en microsecondes (l'ensemble de l'application dépend fortement en raison de sa haute précision de l'application).
Auparavant, j'ai été en utilisant timespec
structure, mais windows ne contient pas une telle chose. La commande GetTickCount
ne suffit pas, car elle retourne le temps en millisecondes. Je pensais aussi des QueryPerformanceFrequency
.
Quelqu'un arrive à savoir quelque chose qui est identique à timespec
possible?
Dans le futur, je pourrais même avoir besoin de nanosecondes, ce qui rien j'ai cherché dans windows prend en charge.
- Quel est le problème avec QueryPerformanceCounter?
- J'ai entendu dire que c'actes douteux lorsqu'il est utilisé avec un processeur dual core. Ne sais pas si c'est totalement vrai ou pas
- La nouvelle (livré avec vs2015, v14.0.xyz) d'exécution comprend un <time.h> en-tête qui définit un timespec type (en fait trois types différents: _timespec32, _timespec64, et timespec). Malheureusement, il n'y a pas d'accompagnement de la macro (par exemple, _TIMESPEC_DEFINED) pour tester la présence de ce type (argh).
Vous devez vous connecter pour publier un commentaire.
Voir, par exemple, Comment réaliser le long-terme minutage haute résolution sur windows à l'aide de C++? et C++ la fonction de Minuterie pour fournir de temps en nano secondes.
J'ai fait quelques tests avec Cygwin sous Windows XP: sur ma machine, la granularité de gettimeofday() est d'environ 15 msecs (~1/64 secs). Ce qui est assez grossier. Et c'est la granularité de:
Deux diviseurs sont 1 000 (POSIX peut avoir 1000000 pour le premier).
Aussi, clock_getres(CLOCK_REALTIME,...) renvoie 15 msecs, donc clock_gettime() est peu probable pour aider. Et CLOCK_MONOTONIC et CLOCK_PROCESS_CPUTIME_ID ne fonctionnent pas.
D'autres possibilités pour Windows peut être RDTSC; voir l'article de Wikipedia. Et HPET, ce qui n'est pas disponible avec Windows XP.
Noter également sous Linux, horloge() est le temps de traitement, alors que sous Windows, c'est le mur du temps.
Donc un exemple de code, à la fois pour Unix standard, et pour CYGWIN code s'exécutant sous Windows, ce qui donne une granulométrie d'environ 50 microsecs (sur mon de la machine). La valeur est en secondes, et donne le nombre de secondes écoulées depuis que la fonction a été appelée en premier. (Je tardivement réalisé que c'était une réponse que j'ai donné plus de il y a un an).
seconds
, et donne le nombre de secondes écoulées depuis que la fonction a été appelée en premier."some peculiar operating systems where the tv_sec member has an unsigned type."
Pour ce faire, le code ci-dessus a besoin d'un plâtre, ou de l'hypothèse que l'horloge ne s'exécute en arrière.Portable entre Windows, UNIX, Linux et quelque chose de vaguement moderne:
std::chrono::high_resolution_clock
. La résolution peut varier, mais vous pouvez trouver au moment de la compilation de ce qu'il est. Nanosecondes est certainement possible sur du matériel moderne.Garder à l'esprit qu'une précision à la nanoseconde signifie vraiment un sous-compteur de précision. Une nanoseconde à lightspeed est à seulement 30 centimètres. Déplacement de votre ordinateur à partir du haut de la clayette vers le bas est littéralement en mouvement par plusieurs nanosecondes.