我刚开始使用谷歌基准测试,当在本地运行代码与在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 19057991QuickBench结果:

发布于 2018-08-29 21:13:07
基准测试结果与平台/架构/机器相关。当你在同一台机器上运行它们时,假设你的基准测试总是相同的,这甚至是不现实的,温度,性能缩放选项,损耗等因素都会影响性能。
发布于 2020-04-17 20:28:55
我只是在我的机器上运行你的例子,我看到了下面的结果:
----------------------------------------------------------------
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中的值进行比较是没有意义的。相反,我使用基准值来比较同一台机器上的不同实现或算法,从而消除了这些疑虑。
https://stackoverflow.com/questions/52076296
复制相似问题