首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向Google Benchmark程序传递参数

如何向Google Benchmark程序传递参数
EN

Stack Overflow用户
提问于 2018-07-25 20:51:36
回答 2查看 6K关注 0票数 3

我有一个C++谷歌基准程序。它使用谷歌的BENCHMARK_MAIN()方法。现在,我使用Go脚本调用并执行编译后的程序。有没有办法将参数传递到我的基准程序中?(我知道main方法的常见方法,但我不确定如何在Googletest中做到这一点,因为它是用benchmark_api.h实现的,我不能改变这一点。)

更新:

到目前为止,我将宏主体复制到我的benchmark.cpp中,并添加了一行。这不是一个很好的解决方案,因为Google可能在这个Macro上进行的更改(例如更改名称或添加代码行)不会影响我的副本。它终于开始工作了。

代码语言:javascript
复制
int main (int argc, char** argv)
{
    MyNamespace::conf = {argv[1]};
    ::benchmark::Initialize (&argc, argv);
    ::benchmark::RunSpecifiedBenchmarks ();
}
EN

回答 2

Stack Overflow用户

发布于 2018-07-26 16:31:41

破解整个BENCHMARK_MAIN函数当然是一种方法,但我认为这真的很麻烦,也很丑陋。因此,我将提出一种不同的方法:

代码语言:javascript
复制
// define your chunksize and iteration count combinations here (for i and j) 
static void CustomArguments(benchmark::internal::Benchmark* b) {
  for (int i = 0; i <= 10; ++i)
    for (int j = 0; j <= 50; ++j)
      b->Args({i, j});
}

// the string (name of the used function is passed later)
static void TestBenchmark(benchmark::State& state, std::string func_name) {
  // cout for testing purposes
  std::cout << state.range(0) /* = i */ << " " << state.range(1) /* = j */ 
  << " " << func_name << std::endl;
  for (auto _ : state) {
     // do whatever with i and j and func_name
  }
}

// This macro is used to pass the string "function_name1/2/3" 
// as a parameter to TestBenchmark
BENCHMARK_CAPTURE(TestBenchmark, benchmark_name1, "function_name1")
    ->Apply(CustomArguments);
BENCHMARK_CAPTURE(TestBenchmark, benchmark_name2, "function_name2")
    ->Apply(CustomArguments);
BENCHMARK_CAPTURE(TestBenchmark, benchmark_name3, "function_name3")
    ->Apply(CustomArguments);

BENCHMARK_MAIN()

然后在go脚本中,使用正则表达式过滤器调用基准:

./prog_name --benchmark_filter=InsertRegexFilterHere

举个例子:

./prog_name --benchmark_filter=TestBenchmark/benchmark_name2/5/35

上面的示例将调用基准,并将传递"function_name2“、5和35 (这些是块大小和迭代计数的值),因此输出将类似于:

代码语言:javascript
复制
------------------------------------------------------------------------------
Benchmark                                       Time           CPU Iterations
------------------------------------------------------------------------------
TestBenchmark/benchmark_name2/5/35               2 ns          2 ns  308047644
票数 3
EN

Stack Overflow用户

发布于 2021-03-18 19:33:10

我想扩展Mike van Dyke的回答,补充说该库还支持以下内容:

代码语言:javascript
复制
static void BM_SetInsert(benchmark::State& state) {
  std::set<int> data;
  for (auto _ : state) {
    state.PauseTiming();
    data = ConstructRandomSet(state.range(0));
    state.ResumeTiming();
    for (int j = 0; j < state.range(1); ++j)
      data.insert(RandomNumber());
  }
}
BENCHMARK(BM_SetInsert)
    ->Args({1<<10, 128})
    ->Args({2<<10, 128})
    ->Args({4<<10, 128})
    ->Args({8<<10, 128})
    ->Args({1<<10, 512})
    ->Args({2<<10, 512})
    ->Args({4<<10, 512})
    ->Args({8<<10, 512});

在您的基准测试中,state.range(0)state.range(1)现在分别引用第一个和第二个参数。查看更多@ https://github.com/google/benchmark#passing-arguments

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51519376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档