Quelqu’un peut-il décrypter si timeGetTime () ou QueryPerformanceCounter / QueryPerformanceFrequency a une surcharge ou / et une précision inférieure?

L’idée est qu’un projet existant utilise timeGetTime () (pour les cibles Windows) assez fréquemment.

milliseconds = timeGetTime(); 

Maintenant, cela pourrait être remplacé par

 double tmp = (double) lpPerformanceCount.QuadPart/ lpFrequency.QuadPart; milliseconds = rint(tmp * 1000); 

avec lpPerformanceCount.QuadPart et lpFrequency.QuadPart provenant de l’utilisation d’un seul appel à QueryPerformanceCounter () et QueryPerformanceFrequency ().

Je sais que les fonctionnalités internes de Windows sont plutôt voodoo, mais quelqu’un peut-il déchiffrer lequel des deux est plus précis ou / et comporte plus de frais généraux?

Je soupçonne que la précision peut être identique, mais QueryPerformanceCounter peut générer moins de frais généraux. Mais je n’ai aucune donnée difficile à sauvegarder.

Bien sûr, je ne serais pas surpris si le contraire est vrai.

Si les frais généraux sont minimes, je serais plus intéressé de savoir s’il y a une différence de précision.

La précision de timeGetTime () est variable, en fonction du dernier timeBeginPeriod utilisé. Ce ne sera jamais mieux qu’une milliseconde. QueryPerformanceCounter est également variable, en fonction du support matériel. Ce ne sera jamais pire qu’une microseconde environ.

QPC est probablement un peu plus lourd. Votre question n’indique pas vraiment si cela est important pour vous. J’en doute, mais mesurez. Avec QPC.

Attention: QueryPerformanceCounter peut dépendre du processeur. Si votre thread saisit le compteur de performances sur un processeur et aboutit sur un autre avant de reprendre, les résultats risquent de ne pas être fiables. Voir l’ entrée MSDN .

La précision est meilleure sur QPC. timeGetTime est précis dans la plage 1-10 ms (et sa résolution n’est pas plus fine que 1 ms), alors que QPC peut vous donner une précision dans la plage des microsecondes.

Les frais généraux varient. QPC utilise le meilleur temporisateur matériel disponible. Il peut s’agir d’une solution légère intégrée au processeur ou d’une sortie sur la carte mère, ce qui ajoute une latence importante. Et cela pourrait être rendu plus coûteux en ayant à passer par un pilote corrigeant que le matériel de la timer soit bogué.

Mais ni est prohibitif cher. Si vous n’appelez pas le chronomètre des millions de fois par seconde, les frais généraux sont insignifiants pour les deux.

Nous avons mis à jour la documentation de QueryPerformanceCounter, ce qui devrait aider à répondre aux questions ci-dessus. S’il te plait regarde

http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

Ed Briggs Microsoft Corporation

QueryPerformanceCounter ne vous donne pas vraiment le temps. Pour convertir ses valeurs en mesures de temps, vous devez utiliser QueryPerformanceFrequency censé vous indiquer à quelle vitesse le compteur s’incrémente. Mais la valeur de fréquence est plus ou moins une estimation. La fréquence du compteur peut varier en fonction du matériel sous-jacent et de la version du système d’exploitation. Mais cela ne doit pas être considéré comme une constante. Il a un décalage et est parfois accompagné d’une dérive thermique. Cela dit, je vous conseillerais d’utiliser QueryPerformanceCounter avec précaution.

Certains mélangent encore accuracy et granularity . QueryPerformanceCounter a une granularité plus fine, alors que timeGetTime a une meilleure précision.

Cependant, la source la plus rapide est GetSystemTimeAsFileTime qui renvoie une valeur de temps exprimée en unités 100ns. Mais sa granularité n’est pas 100ns. Sa granularité dépend du résultat de timeGetDevCaps et du réglage de timeBeginPeriod . Le réglage correct de ce dernier peut donner une granularité d’environ 10000, ce qui correspond à environ 1 ms.

J’ai écrit plus de détails ici .