Тест 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);
// }

person Ankit Kumar    schedule 17.03.2020    source источник


Ответы (2)


если вы просто скопируете содержимое макроса 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();
  }
person pero_hero    schedule 17.03.2020

В документации предлагается использовать 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();
}
person murfel    schedule 14.09.2020