GetLocalTime () résolution temporelle de l'API

voix
6

Je dois trouver le temps pris par une fonction dans mon application. L'application est une solution Studio 2005 MS VIsual, tout le code C.

J'utilisé Windows API THW GetLocalTime (SYSTEMTIME *) pour obtenir le temps de système actuel avant et après l'appel de fonction que je veux mesurer le temps de. Mais cela a lacune que la plus basse résolution est seulement 1ms. Rien en dessous. Donc, je ne peux pas obtenir une granularité de temps en microsecondes.

Je sais que le temps () qui donne le temps écoulé depuis le temps de l'époque, a également la résolution de 1ms (No microsecondes)

1.) Est-il une autre API Windows qui donne le temps en microsecondes que je peux utiliser pour mesurer le temps consommé par ma fonction?

-UN D

Créé 08/09/2008 à 14:09
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
1

Vous pouvez essayer d'utiliser l' horloge () qui fournira le nombre de « tiques » entre deux points. Une « tique » est la plus petite unité de temps un processeur peut mesurer.

Comme une note de côté, vous ne pouvez pas utiliser l'horloge () pour déterminer le temps réel - que le nombre de tiques entre deux points dans votre programme.

Créé 08/09/2008 à 14:12
source utilisateur

voix
1

Sous Windows , vous pouvez utiliser le 'API de compteur haute performance. Départ: QueryPerformanceCounter et QueryPerformanceCounterFrequency pour les détails.

Créé 08/09/2008 à 14:39
source utilisateur

voix
10

Il y a d'autres possibilités.

QueryPerformanceCounter et QueryPerformanceFrequency

QueryPerformanceCounter renverra un « compteur de performance » qui est en fait une unité centrale de traitement gérés compteur 64 bits qui incrémente de 0 en commençant par la mise sous tension sur l' ordinateur. La fréquence de ce compteur est renvoyé par le QueryPerformanceFrequency . Pour obtenir la référence de temps en secondes , divisez compteur de performance par la fréquence de performance. Dans Delphi:

function QueryPerfCounterAsUS: int64;     
begin
  if QueryPerformanceCounter(Result) and
     QueryPerformanceFrequency(perfFreq)
  then
    Result := Round(Result / perfFreq * 1000000);
  else
    Result := 0;
end;

Sur les plateformes multiprocesseurs, QueryPerformanceCounter doit retourner des résultats cohérents quel que soit le CPU le fil est en cours d' exécution sur. Il y a des problèmes occasionnels, mais, le plus souvent causés par des erreurs dans les puces de matériel ou BIOS. , Les patches sont généralement fournis par les fabricants de cartes mères. Deux exemples de MSDN:

Un autre problème avec QueryPerformanceCounter est qu'il est assez lent.

instruction RDTSC

Si vous pouvez limiter votre code à une CPU (SetThreadAffinity), vous pouvez utiliser RDTSC instruction assembleur pour interroger compteur de performance directement à partir du processeur.

function CPUGetTick: int64;
asm
  dw 310Fh // rdtsc
end;

RDTSC résultat est incrémenté de même fréquence que QueryPerformanceCounter. Diviser par QueryPerformanceFrequency pour obtenir le temps en secondes.

QueryPerformanceCounter est beaucoup plus lent thatn RDTSC car il doit prendre en compte plusieurs processeurs et processeurs à fréquence variable. De blog de Raymon Chen :

(QueryPerformanceCounter) compte le temps écoulé. Il doit, puisque sa valeur est régie par la fonction QueryPerformanceFrequency, qui renvoie un nombre indiquant le nombre d'unités par seconde, et la fréquence est spec'd ne pas changer pendant que le système est en cours d'exécution.

Pour les processeurs qui peuvent fonctionner à une vitesse variable, cela signifie que la couche d'abstraction ne peut pas utiliser une instruction comme RDTSC, car cela ne correspond pas avec le temps écoulé.

timeGetTime

TimeGetTime appartient aux fonctions multimédia Win32 Win32. Il retourne en millisecondes avec une résolution de 1 ms, au moins sur un matériel moderne. Il ne fait pas mal si vous exécutez timeBeginPeriod (1) avant de commencer à mesurer le temps et timeEndPeriod (1) lorsque vous avez terminé.

GetLocalTime et GetSystemTime

Avant Vista, les deux GetLocalTime et GetSystemTime retour heure actuelle avec une précision milliseconde, mais ils ne sont pas exacts à un millième de seconde. Leur précision est typiquement dans la gamme de 10 à 55 millisecondes. ( La précision est pas la même que la précision ) Sur Vista, GetLocalTime et GetSystemTime travail avec à la fois une résolution de 1 ms.

Créé 08/09/2008 à 15:06
source utilisateur

voix
2

Une mise en garde sur les systèmes multiprocesseurs:

de http://msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx

Sur un ordinateur multiprocesseur, il ne devrait pas question que le processeur est appelé. Cependant, vous pouvez obtenir des résultats différents sur différents processeurs en raison de bugs dans le système d'entrée / sortie de base (BIOS) ou la couche d'abstraction matérielle (HAL). Pour définir l'affinité du processeur pour un fil, utiliser la fonction SetThreadAffinityMask.

al Weiner

Créé 10/12/2008 à 18:07
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more