提问者:小点点

Google/Benchmark结果不一致


我不熟悉使用Google Benchmark,当在本地与Quick-Bench.com上运行代码时,运行相同的Benchmark(下图)会收到不同的结果,它使用C++检索本地时间。两次我都使用了gcc8.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结果:


共2个答案

匿名用户

基准测试结果依赖于平台/体系结构/机器。假设基准测试在同一台机器上运行时总是相同是不现实的,温度,性能调整选项,磨损等都会影响性能。

匿名用户

我只是在我的机器上运行你的例子,我看到下面的结果:

----------------------------------------------------------------
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

假设一个指令需要1个时钟周期,在我的系统上是,那么比值大约是

不过,我不应该真的担心,因为至少对我来说,这并不是制定基准的目的。将我的系统中的值与Quick Bench中的值进行比较是没有意义的。相反,我使用基准值来比较同一台机器上的不同实现或算法,消除了这样的疑虑。