Google/ бенчмарк противоречивые результаты

Я новичок в использовании Google Benchmark и получаю разные результаты, используя тот же тест (ниже), который извлекает местное время с использованием C++ при локальном запуске кода против http://quick-bench.com/. Оба раза я использовал GCC 8.2 и -O3.

Почему результаты сильно отличаются между локальным и быстрым доступом на quick-bench.com? Что правильно?

#include <benchmark/benchmark.h>
#include <ctime>      
#include <sys/time.h> 
#include <chrono>     


static void BM_ctime(benchmark::State& state) {
  unsigned long long count = 0;

  for (auto _ : state) {
    std::time_t sec = std::time(0);  

    benchmark::DoNotOptimize(count += sec);
  }
}

BENCHMARK(BM_ctime);


static void BM_sysTime(benchmark::State& state) {
  unsigned long long count = 0;

  for (auto _ : state) {
    unsigned long sec = time(NULL);

    benchmark::DoNotOptimize(count += sec);
  }
}

BENCHMARK(BM_sysTime);


static void BM_chronoMilliseconds(benchmark::State& state) {
  unsigned long long count = 0;

  for (auto _ : state) {
    unsigned long long ms = std::chrono::duration_cast<std::chrono::milliseconds>(
      std::chrono::system_clock::now().time_since_epoch()
    ).count();

    benchmark::DoNotOptimize(count += ms);
  }
}

BENCHMARK(BM_chronoMilliseconds);

static void BM_chronoSececonds(benchmark::State& state) {
  unsigned long long count = 0;

  for (auto _ : state) {
    unsigned long long sec = std::chrono::duration_cast<std::chrono::seconds>(
      std::chrono::system_clock::now().time_since_epoch()
    ).count();

    benchmark::DoNotOptimize(count += sec);
  }
}

BENCHMARK(BM_chronoSececonds);

Локально получаются следующие результаты:

-------------------------------------------------------------
Benchmark                      Time           CPU Iterations
-------------------------------------------------------------
BM_ctime                     183 ns        175 ns    4082013
BM_sysTime                   197 ns        179 ns    4004829
BM_chronoMilliseconds         37 ns         36 ns   19092506
BM_chronoSececonds            37 ns         36 ns   19057991

Результаты QuickBench:

1 ответ

Результаты тестов зависят от платформы / архитектуры / машины. Даже не практично предполагать, что ваши тесты всегда будут одинаковыми, когда вы запускаете их на одном и том же компьютере, такие как температура, параметры масштабирования производительности, износ и т. Д. Могут повлиять на производительность.

Я просто запустил ваш пример на своей машине и вижу результат ниже:

----------------------------------------------------------------
Benchmark                      Time             CPU   Iterations
----------------------------------------------------------------
BM_ctime                    3.26 ns         3.25 ns    215110555
BM_sysTime                  3.26 ns         3.25 ns    215154791
BM_chronoMilliseconds       2502 ns         2502 ns       279856
BM_chronoSececonds          2502 ns         2501 ns       279854

Предполагая, что NOP инструкция занимает 1 такт, что составляет 0.5 ns в моей системе соотношение CPU time / NoOp time вокруг 5000.

Однако мне не стоит особо беспокоиться, потому что бенчмаркинг предназначен не для этого, по крайней мере, для меня. Нет смысла сравнивать значения в моей системе со значениями из Quick Bench. Скорее, я использую эталонные значения для сравнения различных реализаций или алгоритмов на одной и той же машине, устраняя такие сомнения.

Другие вопросы по тегам