Intereting Posts
C найти размер статического массива (предотrotation ошибок) Как контролировать переменные в GDB и регистрировать его, если он соответствует определенным условиям? Декларация C из стандартной библиотеки сигналов Группа вариативных макросов отображение изображения с помощью gstreamer с API c Возможно ли написать функцию, которая может изменить строку без использования строки буфера? Как получить большее случайное число из функции c rand () Socket uneclared, когда я использую -std = c99 gdb разобрать по номеру строки Функция C, которая подсчитывает строки в файле Почему я получаю сообщение об ошибке, когда инициализатор не является константой? Неопределенное поведение для доступа к массиву за его пределами, если эта область выделена? Предоставление / передача аргумента обработчику сигналов Какое правильное определение size_t? Удаление элементов из динамических массивов

Время вычислений в linux: гранулярность и точность

********************** Оригинальное исправление **********************


Я использую разные типы часов, чтобы получить время в системах LINUX:

rdtsc, gettimeofday, clock_gettime

и уже читал различные темы, подобные этим:

Какое лучшее временное разрешение я могу получить в Linux?

Как достигается микросекундное время получения linux gettimeofday () и какова его точность?

Как измерить временной интервал в C?

более быстрый эквивалент gettimeofday

Гранулярность во времени

Почему clock_gettime так неустойчив?

Но я немного смущен:


В чем разница между гранулярностью, разрешением, точностью, точностью?


Гранулярность (или разрешение или точность) и точность – это не одно и то же (если я прав …)

Например, при использовании «clock_gettime» точность составляет 10 мс, когда я получаю:

struct timespec res; clock_getres( CLOCK_REALTIME, &res): 

и степень детализации (которая определяется как тики в секунду) составляет 100 Гц (или 10 мс), как я получаю при выполнении:

  long ticks_per_sec = sysconf(_SC_CLK_TCK); 

Точность находится в наносекундах, так как приведенный выше код предлагает:

struct timespec gettime_now;

clock_gettime (CLOCK_REALTIME, & gettime_now); time_difference = gettime_now.tv_nsec – start_time;

В приведенной ниже ссылке я увидел, что это глобальное определение детализации Linux, и лучше не изменять его:

http://wwwagss.informatik.uni-kl.de/Projekte/Squirrel/da/node5.html#fig:clock:hw

Итак, мой вопрос: если бы это было замечание выше, было правильным, а также:

a) Можем ли мы видеть, что такое гранулярность rdtsc и gettimeofday (с помощью команды)?

б) Можем ли мы изменить их (каким-либо образом)?

заранее спасибо


********************** Редактировать no2 **********************

Привет всем, я проверил несколько новых часов, и мне нравится делиться информацией:

a) На приведенной ниже странице Дэвид Терей сделал прекрасную программу, которая сравнивает различные часы и их выступления:

https://github.com/dterei/Scraps/tree/master/c/time

б) Я также тестировал omp_get_wtime, как предложил Раксман , и я нашел точность в nsec, но не очень лучше, чем «clock_gettime» (как это было на этом сайте):

http://msdn.microsoft.com/en-us/library/t3282fe5.aspx

Я думаю, что это оконная ориентированная функция времени

Лучшие результаты даются с помощью clock_gettime с использованием CLOCK_MONOTONIC, чем при использовании CLOCK_REALTIME. Это нормально, потому что первый рассчитывает время обработки и другое РЕАЛЬНОЕ ВРЕМЯ соответственно

c) Я нашел также функцию Intel ippGetCpuClocks , но не я ее не тестировал, потому что сначала необходимо зарегистрироваться:

http://software.intel.com/en-us/articles/ipp-downloads-registration-and-licensing/

… или вы можете использовать пробную версию

Спасибо всем за ваши ответы !!!


  • Точность – это количество информации, то есть количество значимых цифр, которые вы сообщаете. (Например, я – 2 м, 1,8 м, 1,83 м, 1,8322 м. Все эти измерения являются точными, но все более точными).

  • Точность – это отношение между сообщенной информацией и правдой. (Например, «Я ростом 1,70 м», точнее, чем «1,8 м», но на самом деле не точно).

  • Гранулярность или разрешение являются наименьшим временным интервалом, который может измерять таймер. Например, если у вас есть гранулярность 1 мс, мало что нужно сообщить о результатах с точностью до наносекунды, поскольку она не может быть точной с таким уровнем точности.

В Linux доступные таймеры с растущей детализацией:

  • clock() от (разрешение 20 мс или 10 мс?)

  • gettimeofday() из Posix (микросекунды)

  • clock_gettime() в Posix (наносекунды?)

В C ++ заголовок предлагает некоторую абстракцию вокруг этого, и std::high_resolution_clock пытается дать вам наилучшие часы.