Таймеры для измерения задержки - PullRequest
5 голосов
/ 20 ноября 2008

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 20 ноября 2008

Это копия моего ответа от: Функция таймера C ++ для предоставления времени в нано секундах

Для 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

Очевидно, существует известная проблема 1017 * с QPC на некоторых чипсетах, поэтому вы можете убедиться, что у вас нет этих чипсетов. Кроме того, некоторые двухъядерные процессоры AMD могут также вызвать проблему . Смотрите второй пост от sebbbi, где он заявляет:

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

2 голосов
/ 20 ноября 2008

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

0 голосов
/ 09 февраля 2011

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

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

Здесь много сообщений об этом на stackoverflow.com. Я сам написал несколько ...

...