Google Benchmark, как вызвать код только один раз? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть фрагмент кода, который мне нужно протестировать, состоящий из двух частей: сначала состояние нужно установить ровно один раз, затем мне нужно проверить функцию.

Мой код выглядит так:

static void BM_LoopTime(benchmark::State& state) 
{
    MasterEngine engine;
    for (auto _ : state)
    {
        engine.LoopOnce();
    }
}
BENCHMARK(BM_LoopTime);

В моем выводе я получаю:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Pointer already set                                                             
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Несколько раз, что является настраиваемым сообщением об ошибке, которое указывает на очень важный указатель, к которому следует касаться только один раз, пытается быть перезаписан.

Вызов этого кода несколько раз является неопределенным поведением в моей реализации. Как я могу вызвать инициализацию объекта ровно один раз, а затем сказать ему вызвать l oop?

1 Ответ

1 голос
/ 28 мая 2020

Это обходной путь, который, как я обнаружил, достаточно хорош для моего варианта использования, но я все еще ищу лучшие решения:

class MyFixture : public benchmark::Fixture 
{
public:
    std::unique_ptr<MasterEngine> engine;

    void SetUp(const ::benchmark::State& state) 
    {
        if(engine.get() == nullptr)
            engine = std::make_unique<MasterEngine>();
    }

    void TearDown(const ::benchmark::State& state) 
    {
    }
};
...