При проверке результатов моих тестов с помощью платформы Google Benchmark я заметил, что стандартное отклонение измеренного времени процессора во многих случаях значительно превышает стандартное отклонение измеренного реального времени.
Почему это?Или это результат ошибок измерений?Я весьма удивлен этим, потому что ожидал, что время процессора будет более воспроизводимым.
Это общее наблюдение в моей системе.Тем не менее, я приведу простой пример:
#include <benchmark/benchmark.h>
#include <cmath>
static void BM_SineEvaluation(benchmark::State& state)
{
for (auto _ : state)
{
double y = 1.0;
for (size_t i = 0; i < 100; ++i)
{
y *= std::sin(y) * std::sin(y) + std::cos(y) * std::cos(y);
y+= std::sin(std::cos(y));
}
benchmark::DoNotOptimize(y);
}
}
BENCHMARK(BM_SineEvaluation);
В этом примере даже нет распределения кучи.Ни одна из функций sin / cos не оптимизирована компилятором.Вот и весь код.Измерения времени полностью выполняются в библиотеке Google Benchmark, которая открыто доступна на github.Но я пока не изучал реализацию.
При запуске программы с аргументами командной строки --benchmark_repetitions = 50 --benchmark_report_aggregates_only = true, я получаю вывод, подобный этому:
----------------------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------------------
BM_SineEvaluation_mean 11268 ns 11270 ns 64000
BM_SineEvaluation_median 11265 ns 11230 ns 64000
BM_SineEvaluation_stddev 11 ns 90 ns 64000
Я использую Google Benchmark v1.4.1 на действительно старой версии Intel Core i7 920 (Bloomfield) с оптимизирующим компилятором Microsoft (R) C / C ++ версии 19.00.24218.1 для x86 (Visual Studio 2015) с /O2.
Редактировать: я провел дополнительные измерения на Fedora-28 на процессоре Intel i5-4300U с gcc-8.1.1 (который достаточно умен, чтобы вызывать sincos с -O2) и обнаружил контрастное поведение:
----------------------------------------------------------------
Benchmark Time CPU Iterations
----------------------------------------------------------------
BM_SineEvaluation_mean 54642 ns 54556 ns 12350
BM_SineEvaluation_median 54305 ns 54229 ns 12350
BM_SineEvaluation_stddev 946 ns 888 ns 12350
Если опустить -O2 (что ближе к MSVC, потому что он имеет отдельные вызовы sin / cos), я все равно получаю тот же качественный результат: стандартное отклонение реального времени также больше стандартного отклонениявремя процессора.
Я не совсем уверен, какой вывод из этого сделать.Значит ли это, что измерения времени в Windows менее точны?