Почему я получаю такой огромный джиттер при измерении времени?

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

например

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 ГГц

1

Решение

Спасибо за все ответы.
Основное прерывание, которое я не смог остановить — это прерывание по таймеру. И, похоже, новое ядро ​​3.10 будет поддерживать тик-тик. Я попробую это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]