Как измерить время, которое требуется для выполнения фрагмента кода?

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

clock_t startTime = clock();
//do stuff
//do stuff
//do stuff
//do stuff
float secsElapsed = (float)(clock() - startTime)/CLOCKS_PER_SEC;

Что делать, если программа многопоточна и контекстные переключатели происходят в части, которую я хочу измерить? Как бы я измерил время, которое мой код занимает для выполнения, исключая время, потраченное на другие потоки? Даже если есть инструменты, которые это делают, я бы очень хотел знать как они делают это.

4 ответов


существуют различные способы измерения времени выполнения кода.

Если вы заинтересованы в относительные выполнение определенных функций, a профайлер - это единственный путь. Обратите внимание, что это ослабит влияние блокировки ввода-вывода из-за накладных расходов на вычисления.

Если вы хотите часы на основе времени определенных функций, есть множество вариантов.

лично Я бы сказал gettimeofday вполне достаточно.

Если вы хотите получить точный используйте RDTSC

Если вы хотите получить действительно уточните, вы хотите что-то вроде этого

t1 = rdtsc();
t2 = rdtsc();
my_code();
t3 = rdtsc();
my_code_time = (t3-t2) - (t2-t1)

вам нужно будет повторить этот блок для учета несоответствий планирования потоков, а также обратить внимание на эффекты кэширования.


вот почему бенчмаркинг кода в основном отстой-потому что вы не могу знаешь, сколько времени это займет. Такие вещи, как упреждение ОС, в лучшем случае непредсказуемы. Используйте профессиональный профилировщик, поскольку в них может быть код, который может справиться с этими проблемами или не беспокоиться. Пишу clock() стиль вещи совершенно бессмысленно.


из терминала Linux используйте "time path_to_app"

Это вернет все, что вы хотите знать.


Я подготовил два очень простых класса. Первый ProfileHelper класс заполняет время начала в конструкторе и время окончания в деструкторе. Второй класс ProfileHelperStatistic-это контейнер с дополнительными статистическими возможностями (std:: multimap + несколько методов для возврата среднего, стандартного отклонения и других забавных вещей).

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

взгляните на этот вопрос для получения дополнительной информации C++ Benchmark tool.