Быстрый способ получить текущее время с nsec-разрешением? - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь получить информацию о времени с разрешением в несколько сотен наносекунд (чтобы сделать что-то невероятное на Raspberry Pi).Я попытался с помощью clock_gettime (), которая обеспечивает требуемое разрешение в timespec.tv_nsec, но это слишком медленно.Даже когда я запускаю свой процесс исключительно на одном отдельном ядре ЦП и даже когда я устанавливаю этот процесс с наивысшим приоритетом, весь цикл измерения времени требует около 450 нсек, где около 360 нсек используется функцией clock_gettime ().

Итак, мой вопрос: есть ли способ быстрее получить текущее время?Любая другая функция времени?Или было бы решением использовать модуль ядра вместо процесса пользовательского пространства?

1 Ответ

0 голосов
/ 20 мая 2018

Наверное, нет.clock_gettime() уже реализован через vDSO, так что, вероятно, это будет самый быстрый из возможных системных вызовов.

Но учтите временные рамки.С процессором 2 ГГц 450 наносекунд - это всего лишь 900 тактов.Это не очень много.

На одной машине Core 2 с частотой 1,86 ГГц при работе в цикле, равном clock_gettime(), возвращаются значения, разнесенные на 86 нс.Простое добавление наполнителя for (int j = 0 ; j < 100 ; j++); увеличивает его до 540 нс.(около 4,5 нс за итерацию цикла, или около 8-9 тактов)

В это время вы мало что можете сделать.Что вы можете сделать, так это считать тактовые циклы или повторения циклов.Предварительно используйте clock_gettime(), чтобы определить, сколько времени требуется занятому циклу N итераций на этом компьютере, а затем масштабируйте количество итераций, чтобы получить цикл синхронизации требуемой длины.

YouВам, вероятно, все еще понадобится некоторое время, чтобы выполнить фактическое переключение битов, предполагая, что он проходит через системный вызов.Модуль ядра может быть полезен в этом случае, так как вы можете избежать системных издержек.Внутри ядра также может быть проще предотвратить переопределение кода при работе с битами.

...