Я виявив, що звичайний годинник (), який всі рекомендують тут, чомусь дико відхиляється від запуску до запуску, навіть для статичного коду без будь-яких побічних ефектів, як малюнок на екрані чи читання файлів. Це може бути тому, що процесор змінює режими енергоспоживання, ОС дає різні пріоритети тощо.
Тож єдиний спосіб надійно отримувати один і той же результат кожен раз за допомогою годинника () - запускати вимірюваний код у циклі кілька разів (протягом декількох хвилин), вживаючи запобіжних заходів, щоб запобігти оптимізації компілятора: сучасні компілятори можуть попередньо обчислити код без побічних ефектів, що працюють у циклі, і перемістіть його з циклу, наприклад, використовуючи випадковий вхід для кожної ітерації.
Після того як достатня кількість зразків збирається в масив, один сортує цей масив і бере середній елемент, званий медіаною. Медіана краща за середню, тому що вона викидає екстремальні відхилення, як-от скажімо, антивірус, який піднімає всі процесори або ОС робить деяке оновлення.
Ось проста утиліта для вимірювання ефективності виконання коду C / C ++, усереднення значень біля медіани: https://github.com/saniv/gauge
Я все ще шукаю більш надійний і швидкий спосіб вимірювання коду. Можливо, можна спробувати запустити код у контрольованих умовах на голому металі без будь-якої ОС, але це дасть нереальний результат, адже насправді ОС дійсно задіяна.
x86 має ці апаратні лічильники продуктивності, які включають фактичну кількість виконаних інструкцій, але вони складні для доступу без допомоги ОС, важко інтерпретувати та мають свої проблеми ( http://archive.gamedev.net/archive/reference/articles /article213.html ). Однак вони можуть бути корисними для дослідження характеру горловини пляшки (доступ до даних або фактичні розрахунки за цими даними).