L'extrait de code suivant:
struct timespec ts;
for (int x = 0; x < 100000000; x++) {
timespec_get(&ts, TIME_UTC);
long cTime = (long) time(NULL);
if (cTime != ts.tv_sec && ts.tv_nsec < 3000000) {
printf("cTime: %ld\n", cTime);
printf("ts.tv_sec: %ld\n", ts.tv_sec);
printf("ts.tv_nsec: %ld\n", ts.tv_nsec);
}
}
produit cette sortie:
...
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2527419
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2534036
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2540359
cTime: 1579268059
ts.tv_sec: 1579268060
ts.tv_nsec: 2547039
...
Pourquoi l'écart entre cTime
et ts.tv_sec
? Notez que le problème ne se produit pas si le conditionnel est modifié en ts.tv_nsec >= 3000000
. Le problème repose sur des nanosecondes inférieures à 3000000.
timespec_get()
? Est-ce C ou C ++? On diraitstd::timespec_get
. Veuillez utiliser la balise appropriée.man
entrée pourtimespec_get
sur mon système alors j'ai sauté aux conclusions. Logique.Réponses:
La raison en est que vous utilisez (implicitement) différentes horloges système.
timespec_get()
utilise l' horloge en temps réel à l'échelle du système à haute résolution , tout entime()
utilisant l' horloge en temps réel grossière .Essayez d'utiliser
au lieu du vôtre
timespec_get()
, alors la différence devrait disparaître.Éditer:
Cela peut être vu dans la source du noyau Linux, vclock_gettime.c
En effet, le problème est un peu subtil à voir ici. La partie seconde des membres de structure utilisée par
CLOCK_REALTIME_COARSE
etCLOCK_REALTIME
contient des valeurs identiques, mais la partie nanosecondes est différente; avecCLOCK_REALTIME
elle peut être plus grande que1000000000
(ce qui correspond à une seconde). Dans ce cas, il est fixé sur l'appel:Cette correction n'est effectuée ni avec
CLOCK_REALTIME_COARSE
, ni avectime()
. Cela explique la différence entreCLOCK_REALTIME
ettime()
.la source
time
mise en œuvre avec l'horloge (probablement) plus performante mais moins précise (selon la théorie selon laquelle elle n'a qu'une seconde granularité de toute façon, alors qui a besoin de précision)? Retarder le temps réel d'une milliseconde environ (les tests en ligne ont montré un décalage occasionnel de plus d'un ms, mais pas beaucoup plus) lorsque vous ne demandez qu'une deuxième granularité n'est pas si important que ça.