【问题标题】:How to benchmark custom interface using google benchmark如何使用谷歌基准测试自定​​义界面
【发布时间】: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/Derived1func/Derived2 等等。任何想法如何做到了吗?

【问题讨论】:

  • 解决方案是答案,而不是问题。请将您的解决方案作为答案发布,并将其从问题中删除。 是的,我们鼓励您回答自己的问题!
  • @ReinstateMonica 除非我能克服这个由我的解决方案引起的小烦恼,否则我不希望它成为最佳答案或提出它。我将它作为我的 OP 的更新发布,以便其他人可以看到我的进步并以此为基础。如果有另一个解决方案没有引入这个问题,那么我将接受它作为解决方案,否则我只是更新我的问题,因为在我看来它并不完整。

标签: c++ google-benchmark


【解决方案1】:

您的方法非常正确。如果您想避免使用多个基准测试函数,请将基准测试的核心移动到一个单独的函数中,并从每个类型的每个函数中调用它。比如:

static void Benchmark(Base* b, benchmark::State& st) {
  for (auto _ : state) {
    b->DoTheThing()
  }
}

void BM_Foo(benchmark::State& st) {
  Foo f;
  Benchmark(&f, st);
}

BENCHMARK(BM_Foo);

如果你想更复杂,你可以使用RegisterBenchmark函数更灵活地注册东西。比如:

auto BM_base = [](benchmark::State& st, auto inputs, Base* b) { /* ... */ };

int main(int argc, char**argv) {
  const std::vector<std::size_t> v = {1, 2, 4, 8, 16};
  benchmark::RegisterBenchmark("foo", BM_base, v, new Foo());
  benchmark::Initialize(&argc, argv);
  return benchmark::RunSpecifiedBenchmarks();
}

顺便说一句,在注册基准测试时是否应将 v 设置为 Args?

【讨论】:

  • 我最终得到了一个基准函数,它可以从基于索引的辅助函数中提取指向 base 的指针。索引是使用DenseRange传递的,这样我就可以只有一个函数了。
  • 嘿,我已经用我的解决方案更新了我的问题,还有一个由此实现产生的新问题。很想听听您对如何在更新后的问题中实现我所寻求的意见。
  • 您应该使用模板化基准测试或我的回答中的解决方案之一,这将为您提供所需的命名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2019-08-17
  • 2022-07-27
  • 2018-05-06
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多