Почему время процессора в тестах обычно больше, чем в реальном времени? - PullRequest
0 голосов
/ 27 сентября 2018

При проверке результатов моих тестов с помощью платформы 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 менее точны?

...