2008-11-20 4 views
5

При измерении задержек сети (время, полученное при получении - время отправки сообщений) в любом протоколе через TCP, какой таймер вы бы рекомендовали использовать и почему? Какое разрешение у него есть? Каковы другие преимущества/недостатки?Таймеры для измерения латентности

Дополнительно: как это работает?

Дополнительно: какой таймер вы НЕ используете и почему?

Я ищу в основном решения для Windows/C++, но если вы хотите прокомментировать другие системы, не стесняйтесь это делать.

(В настоящее время мы используем GetTickCount(), но это не очень точный таймер.)

ответ

6

Это копия моего ответа от: C++ Timer function to provide time in nano seconds

для Linux (и BSD) вы хотите использовать 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 
} 

Для окон вы хотите использовать QueryPerformanceCounter. И здесь больше на QPC

По-видимому, на некоторых чипсетах есть issue с QPC, поэтому вы можете убедиться, что у вас нет этого набора микросхем. Кроме того, некоторые двухъядерные AMD могут также вызывать problem. Смотрите второй пост по sebbbi, где он заявляет:

QueryPerformanceCounter() и QueryPerformanceFrequency() предлагают немного более высокое разрешение, но есть различные вопросы. Например, в Windows XP, все AMD Athlon X2 Dual ядра процессоров вернуть ПК либо из сердечников «случайные» (ПК иногда скачки немного назад), если вам специально не установить два драйвера процессоров AMD пакета исправить проблему. У нас нет замечены любые другие двухъядерные процессоры с аналогичными проблемами (p4 dual, p4 ht, core2 dual, core2 quad, phenom quad).

2

Вы упомянули, что вы используете GetTickCount(), так что я буду рекомендовать вам взглянуть на QueryPerformanceCounter() ,

0

На самом деле никакой замены для команды rdtsc не существует. Вы не можете быть уверены в том, какое разрешение будет поддерживать QueryPerformanceCounter. Некоторые из них имеют очень большую степень детализации (низкая скорость/частота), а некоторые ничего не возвращают.

Вместо этого я рекомендую вам использовать инструкцию rdtsc. Он не требует какой-либо реализации ОС и возвращает количество внутренних тактовых циклов процессора, которые истекли с момента включения питания компьютера/процессора/ядра. Для процессора 3 ГГц, который составляет 3 миллиарда инкрементов в секунду - он не становится более точным, чем это, теперь делает? Эта инструкция доступна для x86-32 и -64, начиная с Pentium или Pentium MMX. Поэтому он должен быть доступен из x86 Linuxes.

Существует много сообщений об этом здесь, на stackoverflow.com. Я написал несколько из них ...

Смежные вопросы