Как быстро и надежно измерить время выполнения функции в C (т. е. любой эквивалент функции Python %timeit?)

В настоящее время я изучаю C оптимизацию реализации различных алгоритмов (которые я в настоящее время реализовал на Python).

Чтобы помочь мне сравнить реализации C и Python, я хочу измерить время выполнения функции.

Используя Python, iPython REPL предлагает фантастическую функциональность %timeit, которая эффективно повторяет функцию много раз и отображает среднее время выполнения и индикацию вариации по сравнению с тем, сколько раз она выполнялась? Это работает для времени выполнения, варьирующегося от наносекунд до многих секунд.

В C я читал о команде time, которую можно добавить в код, чтобы сообщать о времени выполнения одного запуска. Однако у этого есть 2 ограничения:

1) только миллисекундное разрешение

2) это только «однократное» измерение.

Поэтому мой вопрос: существуют ли какие-либо лучшие/альтернативные подходы или пакеты для C, которые позволят быстро, но точно (т.е. даже работать для быстрых функций времени выполнения ns) отображать время выполнения?


person SLhark    schedule 26.10.2019    source источник
comment
Нет ничего встроенного. %timeit запускает код много раз, чтобы получить среднее время, вам просто нужно сделать то же самое в вашей программе на C.   -  person Barmar    schedule 26.10.2019
comment
Хорошо, это имеет смысл. Но есть ли способ получить разрешение ns? Функция времени C кажется ограниченной мс, что слишком медленно для точного профилирования.   -  person SLhark    schedule 26.10.2019
comment
Вы говорите нам, что не можете заставить свою функцию выполняться достаточно раз, чтобы попасть в миллисекундный диапазон? что вы пытаетесь рассчитать, return утверждение?   -  person lenik    schedule 26.10.2019
comment
О, хорошо, запустите его 10000 раз, а затем получите общее время. Это будет работать, но не дает никаких указаний на различия между выполнениями.   -  person SLhark    schedule 26.10.2019
comment
В зависимости от вашей системы вы можете вызвать gettimeofday, чтобы получить время с разрешением в микросекунды, или clock_gettime, чтобы получить разрешение в наносекундах. Или вы можете вызвать clock(), чтобы получить процессорное время с разрешением в доли секунды, определяемым CLOCKS_PER_SEC. (А с помощью clock_gettime вы можете выбирать между стеной, прошедшим временем или процессорным временем.)   -  person Steve Summit    schedule 26.10.2019
comment
См. также этот другой вопрос для некоторых рекомендаций.   -  person Steve Summit    schedule 26.10.2019