2011-01-23 2 views
1

Есть ли способ проверить детализацию функции gettimeofday(), предоставляемой POSIX?Гранулярность во временной функции

+0

Я неясно ваш вопрос: в соответствии со стандартом разрешение микросекунд - «Функция gettimeofday() должна получить текущее время, выраженное в секундах и микросекунд с начала эпохи» Вы спрашиваете, есть ли программный способ проверить, что разрешение системных часов меньше микросекунды? – RomanK

+1

@RomanK: Разрешение и гранулярность - это не одно и то же. POSIX действительно определяет микросекунды, но при данной реализации эти микросекунды могут увеличиваться, например, на 1000 раз за раз. – caf

ответ

1

Назовите его в замкнутой петле, обратите внимание на разницу между текущим значением и предыдущим при его изменении. Что-то вроде следующего:

#include <stdio.h> 
#include <sys/time.h> 

int main() 
{ 
     struct timeval timevals[2]; 
     int cur = 0; 
     while (1) { 
       gettimeofday(&timevals[cur], NULL); 
       int diff = timevals[cur].tv_usec - timevals[!cur].tv_usec; 
       if (diff) 
         printf("%d\n", diff); 
       cur = !cur; 
     } 
} 

На моей системе, кажется, зернистость составляет около 2 мксек (около 50/50 одного или двух микросекунд, с выбросами в сотни или тысячи, которые, вероятно, из-за переключения задач).

+0

Вы переоцениваете задержку, потому что подсчитываете время, необходимое для форматирования разницы. Вы должны называть 'gettimeofday (& timevals [! Cur], NULL);' сразу после строки 'cur =! Cur;', чтобы минимизировать разрыв между вызовами. Вероятно, вы обнаружите, что результат чаще всего равен нулю, потому что ваш компьютер достаточно быстр, чтобы сделать два 'gettimeofday()' звонка за одну микросекунду. Не забывайте, что микросекунда - 3000 тактов, если ваш процессор работает на частоте 3 ГГц; вы можете сделать довольно много за 3000 тактов. –

3

Вместо gettimeofday(), рассмотрите возможность использования clock_gettime() (с указанием часов CLOCK_REALTIME). Это также POSIX и поддерживает функцию clock_getres() для получения разрешения.

+0

Но 'clock_getres' всегда возвращает 1 нс для hrtimers вместо реального разрешения по таймеру. – osgx

-1

Текущий способ получить POSIX разрешение gettimeofday() является

#include <unistd.h> 
long ticks_per_sec = sysconf(_SC_CLK_TCK); 

В старых версиях Posix (не уверен, когда изменение произошло), значение CLOCKS_PER_SEC было с помощью #define.

+3

CLOCKS_PER_SEC является стандартным C и применяется к' clock() '; '_SC_CLK_TCK' применяется к' times() '. Ни один из них не применяется к 'gettimeofday()'. –

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