谷歌基准测试,如何只调用一次代码?

Google Benchmark, how to call code only once?

本文关键字:一次 代码 调用 基准测试 谷歌      更新时间:2023-10-16

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

我的代码如下所示:

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

在我的输出中,我得到:

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

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

在我的实现中,多次调用该代码是未定义的行为。如何精确地调用对象初始化一次,然后告诉它调用循环?

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

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) 
{
}
};