【发布时间】:2020-05-31 11:57:50
【问题描述】:
因为除了 github 自述文件之外我找不到真正好的资源或文档,我会在这里询问社区。p>
假设我有一个名为Base 的接口和多个派生类型。
我想对具有相同函数和传递给Foo 的相同参数的所有派生类型的虚函数Foo 进行基准测试。
对于每个派生类型,我想在单个基准测试中多次调用Foo,并使用从std::vector<std::size_t> 传递的不同参数。
我的一些派生类型的构造函数也需要额外的参数,我应该如何处理它?
在我看来,最简单的做法是使用模板化基准测试并传递给:
const std::vector<std::size_t> v {1, 2, 4, 8, 16};
BENCHMARK_TEMPLATE(func, Derived1, v);
BENCHMARK_TEMPLATE(func, Derived2, v);
BENCHMARK_TEMPLATE(func, Derived3, v);
...
我认为这不是正确的方法,因为对于每个具有不同构造函数签名的派生类型,我需要具有与前一个几乎相同的不同基准函数。
对此进行基准测试的正确方法是什么?
**更新*: 我解决这个问题的方法如下:
std::unique_ptr<Base> GetObj(const std::size_t index)
{
switch(index)
{
case 0:
return std::make_unique<Derived1>(...);
case 1:
return std::make_unique<Derived2>(...);
...
}
}
void func(benchmark::State& state)
{
auto r = state.range();
auto object = GetObj(r);
for (auto _ : state)
{
...
}
}
BENCHMARK(func)->DenseRange(0,5);
但我不喜欢的是基准测试的名称是 func/0-5 模式,我希望它是 func/Derived1、func/Derived2 等等。任何想法如何做到了吗?
【问题讨论】:
-
解决方案是答案,而不是问题。请将您的解决方案作为答案发布,并将其从问题中删除。 是的,我们鼓励您回答自己的问题!
-
@ReinstateMonica 除非我能克服这个由我的解决方案引起的小烦恼,否则我不希望它成为最佳答案或提出它。我将它作为我的 OP 的更新发布,以便其他人可以看到我的进步并以此为基础。如果有另一个解决方案没有引入这个问题,那么我将接受它作为解决方案,否则我只是更新我的问题,因为在我看来它并不完整。
标签: c++ google-benchmark