【问题标题】:How to use a templated google benchmark fixture with custom arguments correctly?如何正确使用带有自定义参数的模板化谷歌基准测试装置?
【发布时间】:2019-05-06 13:14:26
【问题描述】:

我想修改一个模板化的谷歌基准(带有自定义参数)以使用测试夹具类运行,但不知道这是否真的可行,如果可以,正确的语法如何。

仅添加夹具类似乎还不够。

static void CustomArguments(benchmark::internal::Benchmark* b) {
    // define I, J
    for (auto i : I)
    {
        for (auto j : J)
            b->Args({i, j});
    }
}

template<typename my_type>
class My_Fixture : public benchmark::Fixture
{
protected:
    void SetUp(const ::benchmark::State& state) { ...}

    virtual void TearDown() { ...}
};

template <typename any_type>
static void insert(benchmark::State& state)
{
    for (auto _ : state)
    { ...}
}

BENCHMARK_TEMPLATE_F(My_Fixture, insert, my_type)->Apply(CustomArguments);

BENCHMARK_MAIN();

编译器抱怨最后一行代码 error: expected initializer before '-&gt;' token,但也无法从测试中的夹具中找到变量声明。这可能是结果或附加错误。我需要另外注册灯具吗?该示例在没有固定装置的情况下完美运行。

【问题讨论】:

    标签: google-benchmark


    【解决方案1】:

    您需要使用稍微不方便的注册宏:

    BENCHMARK_TEMPLATE_DEFINE_F 使用夹具定义模板化基准。然后BENCHMARK_REGISTER_F 可用于注册基准,这就是您添加-&gt;Apply(CustomArguments) 调用的地方。

    有关示例,请参阅 here

    【讨论】:

    • 移动-&gt;Apply(CustomArguments) 是一个问题,但有没有办法在使用BENCHMARK_TEMPLATE_DEFINE_F 宏时调用函数?所有的例子都在这个宏之后直接定义了测试语料。所以,我可以让它运行,但必须将我的 insert 函数移动到 BENCHMARK_TEMPLATE_DEFINE_F 块中。单线的优点是,我可以复制它,与另一个my_type(一个结构)进行调用。如何优雅地使用多个my_types
    • 对不起,我错过了。这是夹具特征的一个限制,它要求定义是内联的。但是,如果您使用模板,则可能不需要夹具类。您可以围绕for 循环进行设置和拆卸。例如:godbolt.org/z/Ybhv0o
    • 这实际上是我最初的解决方案。但是感谢您确认这是我的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2011-04-02
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多