0

我有一个代码片段,我需要对由两部分组成的基准进行基准测试,首先状态需要设置一次,接下来我需要对函数进行实际基准测试。

我的代码如下所示:

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

在我的输出中,我得到:

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

多次,这是一条自定义错误消息,指示一个非常重要的指针,它应该只被触摸一次,试图被覆盖。

在我的实现中多次调用该代码是未定义的行为。我怎样才能调用对象初始化一次,然后告诉它调用循环?

4

1 回答 1

1

这是一种解决方法,我发现这对我的用例来说已经足够好了,但我仍在寻找更好的解决方案:

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) 
    {
    }
};
于 2020-05-28T02:21:43.153 回答