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. Скорее, я использую эталонные значения для сравнения различных реализаций или алгоритмов на одной и той же машине, устраняя такие сомнения.