Gettimeofday() est-il garanti d'avoir une résolution en microsecondes ?

Je porte un jeu, qui a été écrit à l'origine pour l'API Win32, vers Linux (enfin, je porte le port OS X du port Win32 vers Linux).

J'ai implémenté QueryPerformanceCounter en donnant les uSeconds depuis le démarrage du processus :

BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
    gettimeofday(&currentTimeVal, NULL);
    performanceCount->QuadPart = (currentTimeVal.tv_sec - startTimeVal.tv_sec);
    performanceCount->QuadPart *= (1000 * 1000);
    performanceCount->QuadPart += (currentTimeVal.tv_usec - startTimeVal.tv_usec);

    return true;
}

Ceci, couplé avec QueryPerformanceFrequency() donnant une constante 1000000 comme fréquence, fonctionne bien sur ma machine, me donnant une variable 64 bits qui contient 4 depuis le démarrage du programme.

Alors est-ce portable ? Je ne veux pas découvrir que cela fonctionne différemment si le noyau a été compilé d'une certaine manière ou quelque chose comme ça. Je suis d'accord avec le fait qu'il ne soit pas portable sur autre chose que Linux, cependant.

请先 登录 后评论

2 réponses

Joe Shaw

Donc, cela dit explicitement les microsecondes, mais dit que la résolution de l'horloge système n'est pas spécifiée. Je suppose que la résolution dans ce contexte signifie comment le plus petit montant sera jamais incrémenté ?

La structure de données est définie comme ayant des microsecondes comme unité de mesure, mais cela ne signifie pas que l'horloge ou le système d'exploitation est réellement capable de mesurer cela avec précision.

Comme d'autres personnes l'ont suggéré, gettimeofday() est mauvais car le réglage de l'heure peut provoquer un décalage de l'horloge et perturber votre calcul. clock_gettime(CLOCK_MONOTONIC) est ce que vous voulez, et clock_getres() vous indiquera la précision de votre horloge.

请先 登录 后评论
Doug

La lecture du RDTSC n'est pas fiable dans les systèmes SMP, car chaque CPU maintient son propre compteur et chaque compteur n'est pas garanti d'être synchronisé par rapport à un autre CPU.

Je pourrais suggérer d'essayer clock_gettime(CLOCK_REALTIME). Le manuel posix indique que cela devrait être mis en œuvre sur tous les systèmes conformes. Il peut fournir un décompte en nanosecondes, mais vous voudrez probablement vérifier clock_getres(CLOCK_REALTIME) sur votre système pour voir quelle est la résolution réelle.

请先 登录 后评论