Являются ли clock_gettime () в C ++ и time.time () в эквиваленте python? - PullRequest
0 голосов
/ 27 мая 2020

Я использую boost python и пытаюсь измерить задержку переключения с C ++ на python и наоборот. Но я думаю, что делаю это неправильно, я получаю время в C ++ на clock_gettime() ( t0 ) и передаю его в качестве аргумента функции python, и из этой функции я вызываю time.time() ( t1 ), чтобы узнать время. Но когда я пытаюсь измерить задержку, выполнив t1-t0 , она иногда бывает положительной, иногда отрицательной, а иногда 0. Почему?

1 Ответ

0 голосов
/ 27 мая 2020

Я ожидаю, что эта задержка будет порядка наносекунд, поэтому, если вы хотите ее измерить, важно использовать точные часы и убедиться, что они согласованы. Также имейте в виду, что на этом уровне фактическое считывание часов будет стоить немало, поэтому это может быть нереалистичная цель c в первую очередь.

Для python 3 базовая C вызов функции доступен с использованием time.get_clock_info

В моей системе time.time() использует clock_gettime(CLOCK_REALTIME)

In [1]: import time
In [2]: time.get_clock_info("time")
Out[2]: namespace(adjustable=True, implementation='clock_gettime(CLOCK_REALTIME)', monotonic=False, resolution=1e-09)

Это, вероятно, достаточно для ваших целей, но time.perf_counter(), может иметь лучшую точность, особенно на windows.

Если вы застряли на python 2, согласно источнику time.time() пытается использовать gettimeofday ( ), затем ftime (), затем time (). Поскольку windows не имеет gettimeofday, он будет использовать ftime для максимальной точности в миллисекундах, а в * nix gettimeofday имеет точность только в микросекунды.

На windows вы можете использовать time.clock(), который использует QueryPerformanceCounter(), но на linux он использует clock(), что также обычно составляет всего микросекунду. точности, поэтому, вероятно, не хватает точности.

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

...