2

我有一个非常简单的 Google Benchmark 程序,它对采用两个整数参数的函数进行基准测试,我试图使用基准来查看随着第二个参数的值从1to增加,函数花费的时间究竟如何增加100,所以使用第一个参数保持相同的值999999

在我看来最合乎逻辑的实现方法是使用 Google Benchmark 的Ranges()函数,如下所示:

// registering function 'largestDivisorOdd' as a benchmark
BENCHMARK(largestDivisorOdd) ->Ranges( { {999999, 999999}, {1,100} } );

结果输出是这样的:

-----------------------------------------------------------------------
Benchmark                             Time             CPU   Iterations
-----------------------------------------------------------------------
largestDivisorOdd/999999/1          116 ns          116 ns      6018141
largestDivisorOdd/999999/8          205 ns          205 ns      3485489
largestDivisorOdd/999999/64        2715 ns         2715 ns       260611
largestDivisorOdd/999999/100       2710 ns         2710 ns       256160

我的问题是,Google Benchmark 的范围似乎只从指数增加的值 1to 100,导致第二个参数只有 4 个不同值的 4 个基准,而不是我预期和想要1的100 个 100 个值的基准100.

4

1 回答 1

1

以下其中一项应该有效:

BENCHMARK(largestDivisorOdd)
    ->ArgsProduct({
      benchmark::CreateRange(999999, 999999, /*multi=*/2), // This is probably not what you want
      benchmark::CreateDenseRange(1, 100, /*step=*/1) // This creates a DenseRange from 1 to 100
    })

或者创建您自己的自定义参数:

static void CustomArguments(benchmark::internal::Benchmark* b) {
  for (int i = 999999; i <= 999999; ++i)
    for (int j = 1; j <= 100; j++)
      b->Args({i, j});
}
BENCHMARK(BM_SetInsert)->Apply(CustomArguments);

两个示例均取自用户指南

于 2021-11-15T11:13:12.540 回答