Я пытаюсь измерить производительность функции, измеряя время для каждой итерации.
Во время процесса я обнаружил, что даже если я ничего не делаю, результаты все равно сильно различаются.
например
volatile long count = 0;
for (int i = 0; i < N; ++i) {
measure.begin();
++count;
measure.end();
}
В measure.end () я измеряю разницу во времени и сохраняю unordered_map для отслеживания времени.
Я использовал clock_gettime так же, как и rdtsc, но всегда около 1% точек данных находятся далеко от среднего значения с коэффициентом 1000.
Вот что генерирует вышеуказанный цикл:
T: count percentile
18 117563 11.7563%
19 111821 22.9384%
21 201605 43.0989%
22 541095 97.2084%
23 2136 97.422%
24 2783 97.7003%
...
406 1 99.9994%
3678 1 99.9995%
6662 1 99.9996%
17945 1 99.9997%
18148 1 99.9998%
18181 1 99.9999%
22800 1 100%
mean:21
Так что, будь то тики или нс, наихудший случай 22800 примерно в 1000 раз больше среднего.
Я сделал isolcpus в Grub и выполнял это с набором задач. Простой цикл почти ничего не делает, хеш-таблица для подсчета времени находится за пределами измерений времени.
Что мне не хватает?
Я запускаю это на ноутбуке с установленной Ubuntu, процессор — Intel (R) Core (TM) i5-2520M, процессор @ 2,50 ГГц
Спасибо за все ответы.
Основное прерывание, которое я не смог остановить — это прерывание по таймеру. И, похоже, новое ядро 3.10 будет поддерживать тик-тик. Я попробую это.
Других решений пока нет …