Google基准测试夹具:跨多个基准测试重用向量



我想在加载一个大文件后使用谷歌基准测试库运行多个基准测试。为此,我使用以下代码。函数read_collection()加载文件的内容,基准Build处理来自coll的内容。

#define COLLECTION 'w'
class BuildFixture : public ::benchmark::Fixture {
public:
std::unique_ptr<Collection> coll;
BuildFixture() {
cout << "Constructorn";
coll = std::make_unique<Collection>(Collection(COLLECTION));
coll->read_collection();
}
~BuildFixture() {
cout << "Destroy collectionn";
coll.reset();
}
};
BENCHMARK_DEFINE_F(BuildFixture, Build1)(benchmark::State& state) {
nrows = static_cast<size_t>(state.range(0));
for (auto _ : state) {
// Do something with coll and nrows
}
}
BENCHMARK_DEFINE_F(BuildFixture, Build2)(benchmark::State& state) {
nrows = static_cast<size_t>(state.range(0));
for (auto _ : state) {
// Something else with coll and nrows
}
}

BENCHMARK_REGISTER_F(BuildFixture, Build1)->Arg(10);
BENCHMARK_REGISTER_F(BuildFixture, Build2)->Arg(20);
BENCHMARK_MAIN();

当我运行这段代码时,每个带参数10和20的基准测试都会执行构造函数(总共两次(,运行基准测试,然后调用析构函数。所以输出看起来像

Constructor
Constructor
.. (benchmarking outputs)..
Destroy collection                                                                              
Destroy collection

这最终会花费太多时间多次读取(同一(文件,并且还会占用额外的内存来保存几个基准测试的相同数据。我还担心结果是否会受到页面错误的影响。因此,我有两个问题:

  1. 是否有一种方法可以避免读取文件两次,因为这样可以节省一些执行时间(尽管基准测试中不计算这一时间(
  2. (如果不是(我如何重组多个基准测试代码,使每个基准测试调用构造函数,执行基准测试,销毁,然后转到下一个基准测试?(当然,不必使用多个main函数(

更新1

我需要注册的基准是不同的。我不希望将不同的args传递给同一个基准。我已经用Build1Build2相应地更新了这个问题。

如果定义自己的main,则可以创建一个全局集合并从每个基准引用它。

然而,您也可以通过只注册一次基准来避免这个问题:

BENCHMARK_REGISTER_F(BuildFixture, Build)->Arg(10)->Arg(20)

最新更新