Google /基准测试结果不一致

时间:2018-08-29 11:23:10

标签: c++ google-benchmark

我是使用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结果:

2 个答案:

答案 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中的值进行比较是没有意义的。相反,我使用基准值比较同一台计算机上的不同实现或算法,从而消除了此类疑问。