Как измерить время, которое требуется для выполнения фрагмента кода?
предположим, я хочу измерить время, которое занимает определенный фрагмент кода. Для этого я обычно делаю что-то вроде этого
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()
стиль вещи совершенно бессмысленно.
Я подготовил два очень простых класса. Первый ProfileHelper класс заполняет время начала в конструкторе и время окончания в деструкторе. Второй класс ProfileHelperStatistic-это контейнер с дополнительными статистическими возможностями (std:: multimap + несколько методов для возврата среднего, стандартного отклонения и других забавных вещей).
Я часто использовал эту идею для профилирования. Я думаю, вы могли бы заставить его работать даже в многопоточной среде. Это потребует немного работы, но я не думаю, что это будет так сложно.
взгляните на этот вопрос для получения дополнительной информации C++ Benchmark tool.