1

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

4

2 回答 2

1

基准测试结果取决于平台/架构/机器。当您在同一台机器上运行基准测试时,假设基准测试始终相同甚至是不切实际的,温度、性能扩展选项、磨损等因素都会影响性能。

于 2018-08-29T13:13:07.197 回答
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 中的值进行比较是没有意义的。相反,我使用基准值来比较同一台机器上的不同实现或算法,从而消除这样的疑问。

于 2020-04-17T12:28:54.530 回答