gpt4 book ai didi

c++ - Google基准测试夹具:跨多个基准测试的重用 vector

转载 作者:行者123 更新时间:2023-12-02 10:35:16 39 4
gpt4 key购买 nike

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

#define COLLECTION 'w'

class BuildFixture : public ::benchmark::Fixture {
public:
std::unique_ptr<Collection> coll;

BuildFixture() {
cout << "Constructor\n";
coll = std::make_unique<Collection>(Collection(COLLECTION));
coll->read_collection();
}

~BuildFixture() {
cout << "Destroy collection\n";
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

这最终会花费太多时间来多次读取(相同)文件,并且还会占用额外的内存来为多个基准保存相同的数据。我也担心结果是否会受到页面错误的影响。因此,我有两个问题:
  • 是否有一种方法可以避免必须两次读取文件,因为这样可以节省一些执行时间(尽管基准时间中不计算该时间)。
  • (如果没有)如何以每个基准调用构造函数,执行基准,销毁然后移至下一个基准的方式来重组多个基准代码? (当然,不必使用多个main函数)

  • 更新1

    我需要注册的基准是不同的。我不希望将不同的参数传递给同一基准。我已经用 Build1Build2更新了问题。

    最佳答案

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

    但是,您也可以通过仅注册一次基准测试来避免此问题:

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

    关于c++ - Google基准测试夹具:跨多个基准测试的重用 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60603761/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com