Есть ли способ проверить детализацию функции gettimeofday(), предоставляемой POSIX?Гранулярность во временной функции
ответ
Назовите его в замкнутой петле, обратите внимание на разницу между текущим значением и предыдущим при его изменении. Что-то вроде следующего:
#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 (& timevals [! Cur], NULL);' сразу после строки 'cur =! Cur;', чтобы минимизировать разрыв между вызовами. Вероятно, вы обнаружите, что результат чаще всего равен нулю, потому что ваш компьютер достаточно быстр, чтобы сделать два 'gettimeofday()' звонка за одну микросекунду. Не забывайте, что микросекунда - 3000 тактов, если ваш процессор работает на частоте 3 ГГц; вы можете сделать довольно много за 3000 тактов. –
Вместо gettimeofday()
, рассмотрите возможность использования clock_gettime()
(с указанием часов CLOCK_REALTIME
). Это также POSIX и поддерживает функцию clock_getres()
для получения разрешения.
Но 'clock_getres' всегда возвращает 1 нс для hrtimers вместо реального разрешения по таймеру. – osgx
Текущий способ получить POSIX разрешение gettimeofday() является
#include <unistd.h>
long ticks_per_sec = sysconf(_SC_CLK_TCK);
В старых версиях Posix (не уверен, когда изменение произошло), значение CLOCKS_PER_SEC было с помощью #define.
CLOCKS_PER_SEC является стандартным C и применяется к' clock() '; '_SC_CLK_TCK' применяется к' times() '. Ни один из них не применяется к 'gettimeofday()'. –
- 1. Mutex гранулярность
- 2. сервисная гранулярность
- 3. Временной интервал по функции
- 4. Разница во временной шкале
- 5. Преобразование во временной формат
- 6. Гранулярность смешения парадигм
- 7. DDD Метод обслуживания Гранулярность
- 8. Просмотров Дата Фильтр - гранулярность
- 9. Предполагаемая гранулярность команд Hystrix?
- 10. System.Nanotime гранулярность и латентность?
- 11. Гранулярность контейнеров-докеров
- 12. Гранулярность строк данных
- 13. Функции временной метки Sphinx
- 14. Временной сложности порождающей функции Powerset
- 15. Определение временной сложности рекурсивной функции
- 16. Оптимизация CODE во временной сложности
- 17. Сохранить курсоры во временной таблице
- 18. Комбинированные записи во временной таблице
- 19. Рисование строки во временной области
- 20. Нужно преобразовать следующую строку во временной формат
- 21. Программирование NAND flash: гранулярность записи?
- 22. Правильная гранулярность для блокировки Mutex
- 23. Гранулярность для создания VCS-репозиториев
- 24. Границы услуг и их гранулярность
- 25. гранулярность в дате сортировки MongoDB?
- 26. Гранулярность в спящем режиме ORM
- 27. Места записи во временной области с AVFoundation
- 28. Интеграция в Фурье или во временной области
- 29. Чистая архитектура - Роберт Мартин - Гранулярность использования дела
- 30. Удалить начальный ноль во временной переменной
Я неясно ваш вопрос: в соответствии со стандартом разрешение микросекунд - «Функция gettimeofday() должна получить текущее время, выраженное в секундах и микросекунд с начала эпохи» Вы спрашиваете, есть ли программный способ проверить, что разрешение системных часов меньше микросекунды? – RomanK
@RomanK: Разрешение и гранулярность - это не одно и то же. POSIX действительно определяет микросекунды, но при данной реализации эти микросекунды могут увеличиваться, например, на 1000 раз за раз. – caf