使用命令行参数进行Google基准测试。编写自己的主函数?

7

我有一段类似这样的代码:

...
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);
// }
2个回答

3

如果您只是将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();
  }

3

文档建议使用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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接