Простой, но сложный вопрос:
Какой счетчик использовать, чтобы получить инструменты для измерения времени на настенных часах?
В качестве базовой линии первое, что я думаю при профилировании кода, мне нужно измерить, - это просто время настенных часов, чтобы получить первое представление о том, где код занимает большую часть времени. Меня не волнует, ограничен ли это ввод-вывод, ограниченная полоса пропускания или что-то еще, я просто хочу знать, где он медленный.
Звучит просто, но со всеми трюками, которые современные процессоры делают для эффективной работы (например, масштабирование частоты и т. вещь.
В настоящее время занимаюсь:
perf record -g -e ref-cycles -F 999 -- <cmd>
Я думаю, что это немасштабированная частота процессора и, следовательно, пропорциональна количеству времени настенных часов, в котором выполняется часть кода. Но кто, черт возьми, знает?
constant_tsc
(иnonstop_tsc
, что на самом деле является одним и тем же битом функции: Как получить счетчик циклов ЦП в x86_64 из C ++?) .) Конечно, есть также программное событиеtask-clock
, основанное на измеренном ядром процессоре. IDK, будет ли это работать хорошо или нет. - person Peter Cordes   schedule 12.02.2020ref-cycles
perf действительно останавливается, когда останавливаются тактовые частоты ядра. Это отдельно от фактического TSC. (Настоящее событие HW на современном Intel - этоcpu_clk_unhalted.ref_tsc
илиcpu_clk_unhalted.ref_xclk_any
). На это влияют даже остановки часов для изменения частоты процессора: Потерянные циклы на Intel? Несоответствие между rdtsc и CPU_CLK_UNHALTED.REF_TSC. И это для работы, которая не спит. Таким образом,ref-cycles
подходит для поиска горячих точек ЦП, но не для общих профилей, в которых время ожидания ввода-вывода имеет значение. - person Peter Cordes   schedule 12.02.2020