带有命令行参数的Google基准测试.写我自己的主要功能



我有一个代码类似于:

...
void benchMark(benchmark::State& state){
maxCapacity = state.range(0);
// set up some stuff
for (auto _ : state){
// time this code
}
}
BENCHMARK(benchMark)->DenseRange(2, 10, 1);
BENCHMARK_MAIN();

我想把它改成:

...
void benchMark(benchmark::State& state){
maxCapacity = state.range(0);
// set up some stuff
for (auto _ : state){
// time this code
}
}
int main(){
BENCHMARK(benchMark)->DenseRange(2, 10, 1);
}

我这样做只是为了以后可以为代码提供命令行参数支持。现在这段代码编译成功了,但我根本没有得到任何输出。我想代码甚至都没运行。第一个代码大约需要5分钟才能完成,但第二个代码几乎立即完成执行。我做错了什么?

任何帮助都会很棒。谢谢

编辑:

由于我无法共享完整的代码,这里有一个可重复的最小示例:

#include <iostream>
#include <benchmark/benchmark.h>
using namespace std;
void pointQuery(int maxCapacity){
long sum = 0;
for(int i=0; i<100000*maxCapacity; i++){
for(int j=0; j<100000*maxCapacity; j++)
sum--;
sum+=i;
}
cout<<sum<<endl;
}
void benchMark(benchmark::State& state){
int maxCapacity = state.range(0);
for (auto _ : state)
pointQuery(maxCapacity);
}
BENCHMARK(benchMark)->DenseRange(2, 10, 1);
BENCHMARK_MAIN();
// int main(){
//     BENCHMARK(benchMark)->DenseRange(2, 10, 1);
// }

如果您只是将BENCHMARK_MAIN宏的内容复制到测试文件中,它应该可以工作:

int main(int argc, char** argv) {
BENCHMARK(benchMark)->DenseRange(2, 10, 1);
//these entries are from BENCHMARK_MAIN
::benchmark::Initialize(&argc, argv);
if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1;
::benchmark::RunSpecifiedBenchmarks();
}

文档建议使用benchmark::RegisterBenchmark:

与只能在全局范围内使用的BENCHMARK注册宏不同,RegisterBenchmark可以在任何地方调用。这允许以编程方式注册基准测试。。。例如:

auto BM_test = [](benchmark::State& st, auto Inputs) { /* ... */ };
int main(int argc, char** argv) {
for (auto& test_input : { /* ... */ })
benchmark::RegisterBenchmark(test_input.name(), BM_test, test_input);
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
}

最新更新