2008-11-20 18 views
5

Al medir la latencia de la red (tiempo ack recibido - mensaje de tiempo enviado) en cualquier protocolo sobre TCP, ¿qué temporizador recomendaría utilizar y por qué? ¿Qué resolución tiene? ¿Cuáles son otras ventajas/desventajas?Temporizadores para medir la latencia

Opcional: ¿cómo funciona?

Opcional: ¿qué temporizador NO usarías y por qué?

Estoy buscando principalmente soluciones de Windows/C++, pero si desea comentar sobre otros sistemas, siéntase libre de hacerlo.

(En la actualidad utilizamos GetTickCount(), pero no es un contador de tiempo muy precisa.)

Respuesta

6

Esta es una copia de mi respuesta de: C++ Timer function to provide time in nano seconds

Para Linux (y BSD) que desea utilizar 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 
} 

Para las ventanas que desea utilizar el QueryPerformanceCounter. Y aquí hay más en QPC

Aparentemente existe un conocido issue con QPC en algunos chipsets, por lo que es posible que desee asegurarse de que no tenga esos chipset. Además, algunos AMD de doble núcleo también pueden causar un problem. Véase el segundo mensaje por sebbbi, donde afirma:

QueryPerformanceCounter() y QueryPerformanceFrequency() ofrecerá una poco mejor resolución, pero tienen cuestiones diferentes. Por ejemplo, en Windows XP, todas las CPU de núcleo AMD Athlon X2 de doble devuelven el PC de cualquiera de los núcleos "al azar" (el PC veces salta un poco hacia atrás), a menos que especialmente instalar AMD controlador de doble núcleo paquete para arregla el problema No hemos notado ninguna otra CPU dual + core con problemas similares (p4 dual, p4 ht, core2 dual, core2 quad, phenom quad).

2

Usted ha mencionado que utiliza GetTickCount(), así que voy a recomendar que tome un vistazo a QueryPerformanceCounter() .

0

Realmente no hay sustituto para la instrucción rdtsc. No puede estar seguro de qué resolución será compatible con QueryPerformanceCounter. Algunos tienen una granularidad muy grande (baja frecuencia/tasa de incremento), algunos no devuelven nada.

En su lugar, le recomiendo que use la instrucción rdtsc. No requiere ninguna implementación de sistema operativo y devuelve la cantidad de ciclos de reloj internos de la CPU que han transcurrido desde que la computadora/procesador/núcleo se encendió. Para un procesador de 3 GHz, eso es 3 mil millones de incrementos por segundo, no es más preciso que eso, ¿ahora lo hace? Esta instrucción está disponible para x86-32 y -64 comenzando con el Pentium o Pentium MMX. Por lo tanto, debe ser accesible desde Linux x86 también.

Hay muchas publicaciones al respecto aquí en stackoverflow.com. Yo mismo he escrito algunos ...

Cuestiones relacionadas