2008-11-20 12 views
5

Lors de la mesure de la latence du réseau (accusé de réception de réception de temps - msg envoyé) dans n'importe quel protocole sur TCP, quelle minuterie recommanderiez-vous et pourquoi? Quelle résolution at-il? Quels sont les autres avantages/inconvénients?Minuteries pour mesurer la latence

Facultatif: comment ça marche? En option: quelle minuterie n'utiliseriez-vous PAS et pourquoi? Je cherche principalement des solutions Windows/C++, mais si vous souhaitez commenter sur d'autres systèmes, n'hésitez pas à le faire.

(Actuellement nous utilisons GetTickCount(), mais ce n'est pas une minuterie très précise.)

Répondre

6

Ceci est une copie de ma réponse de: C++ Timer function to provide time in nano seconds

Pour Linux (et BSD) que vous souhaitez utiliser clock_gettime().

#include <sys/time.h> 

int main() 
{ 
    timespec ts; 
    // clock_gettime(CLOCK_MONOTONIC, &ts); // Works on FreeBSD 
    clock_gettime(CLOCK_REALTIME, &ts); // Works on Linux 
} 

Pour les fenêtres que vous souhaitez utiliser le QueryPerformanceCounter. Et voici plus sur QPC

Apparemment, il existe un issue connu avec QPC sur certains chipsets, donc vous pouvez vous assurer que vous n'avez pas ce chipset. De plus, certains AMD à deux cœurs peuvent également provoquer un problem. Voir le deuxième message par sebbbi, où il déclare:

QueryPerformanceCounter() et QueryPerformanceFrequency() offrent une meilleure résolution peu , mais ont questions différentes. Par exemple, dans Windows XP, tous les processeurs dual core AMD Athlon X2 reviennent le PC ou l'autre des les noyaux « au hasard » (le PC parfois saute un peu en arrière), à ​​moins que vous spécialement installer le pilote AMD dual core package résoudre le problème. Nous n'avons pas remarqué tout autre CPU dual core ayant des problèmes similaires (p4 dual, p4 ht, dual core2, quad core2, phenom quad).

2

Vous avez mentionné que vous utilisez GetTickCount(), donc je vais recommander que vous jetez un oeil à QueryPerformanceCounter() .

0

Il n'y a vraiment pas de substitut à l'instruction rdtsc. Vous ne pouvez pas être sûr de la résolution que le QueryPerformanceCounter prendra en charge. Certains ont une très grande granularité (faible taux d'incrément/fréquence), d'autres ne rapportent rien du tout. Au lieu de cela, je vous recommande d'utiliser l'instruction rdtsc au lieu de cela. Il ne nécessite aucune implémentation de système d'exploitation et renvoie le nombre de cycles d'horloge interne du processeur qui se sont écoulés depuis la mise sous tension de l'ordinateur/du processeur/du noyau. Pour un processeur de 3 GHz, c'est 3 milliards d'incréments par seconde - ça ne devient pas plus précis que ça, n'est-ce pas? Cette instruction est disponible pour x86-32 et -64 en commençant par le Pentium ou le Pentium MMX. Il devrait donc être également accessible à partir de Linux x86.

Il y a beaucoup de messages à ce sujet ici sur stackoverflow.com. J'en ai écrit quelques-uns moi-même ...