我有一个C ++ Google Benchmark Program。它使用Google的BENCHMARK_MAIN()
方法。现在,我使用Go脚本调用并执行编译后的程序。有没有办法将参数传递到我的基准程序中? (我知道主要方法的通用方法,但是我不确定如何在Google中使用它,因为它是在benchmark_api.h
中实现的,我不能只是更改它。)
更新:
到目前为止,我已经将makro主体复制到了我的Benchmark.cpp中,并添加了一行。这不是一个很好的解决方案,因为Google在此Makro上所做的可能更改(例如名称更改或添加的代码行)不会影响我的副本。终于可以了。
int main (int argc, char** argv)
{
MyNamespace::conf = {argv[1]};
::benchmark::Initialize (&argc, argv);
::benchmark::RunSpecifiedBenchmarks ();
}
答案 0 :(得分:1)
拥有整个BENCHMARK_MAIN
函数当然是实现这一目标的一种方法,但是IMO确实很麻烦而且很丑陋。所以我只想提出一种不同的方法:
// 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(这些是您的块大小和迭代计数的值),因此输出将类似于:
------------------------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------------------------
TestBenchmark/benchmark_name2/5/35 2 ns 2 ns 308047644
答案 1 :(得分:1)
我想通过补充说该库还支持以下内容来扩展 Mike van Dyke 的回答:
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