我是使用Google Benchmark的新手,在运行相同的基准测试(如下)时会收到不同的结果,该基准测试是在本地运行代码(与Quick-Bench.com相比)时使用C ++检索本地时间。两次我都使用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结果:
答案 0 :(得分:1)
基准测试结果取决于平台/体系结构/机器。假设在同一台计算机上运行基准测试时始终将基准保持不变是不切实际的,温度,性能缩放选项,磨损等因素可能会影响性能。
答案 1 :(得分:0)
我只是在计算机上运行您的示例,然后看到以下结果:
----------------------------------------------------------------
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中的值进行比较是没有意义的。相反,我使用基准值比较同一台计算机上的不同实现或算法,从而消除了此类疑问。