Зернистость в функции времени
Есть ли способ проверить гранулярность функции gettimeofday(), предоставляемой POSIX?
3 ответа
Называйте его в узком цикле, обратите внимание на разницу между текущим значением и предыдущим при его изменении. Что-то вроде следующего:
#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 одной или двух микросекунд, с выбросами в сотни или тысячи, что, вероятно, связано с переключением задач).
Вместо gettimeofday()
рассмотрите возможность использования clock_gettime()
(указав CLOCK_REALTIME
Часы). Это также POSIX, и поддерживает clock_getres()
Функция для получения разрешения.
Текущий способ получения разрешения gettimeofday() в формате posix:
#include <unistd.h>
long ticks_per_sec = sysconf(_SC_CLK_TCK);
В более старых версиях posix (не уверен, когда произошло изменение), значение CLOCKS_PER_SEC было #defined.