C++ googlebenchmarkfixture:跨多个基准的重用向量

C++ googlebenchmarkfixture:跨多个基准的重用向量,c++,microbenchmark,google-benchmark,C++,Microbenchmark,Google Benchmark,我想在加载一个大文件后使用google基准库运行多个基准测试。为此,我使用以下代码。函数read\u collection()加载文件的内容,基准Build处理coll中的内容 #define COLLECTION 'w' class BuildFixture : public ::benchmark::Fixture { public: std::unique_ptr<Collection> coll; BuildFixture() { c

我想在加载一个大文件后使用google基准库运行多个基准测试。为此,我使用以下代码。函数
read\u 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();
这会导致多次读取(同一)文件花费太多时间,并且会占用额外内存来保存多个基准测试的相同数据。我还担心结果是否会受到页面错误的影响。因此,我有两个问题:

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


    我需要注册的基准是不同的。我不希望将不同的参数传递给同一个基准。我已经用
    Build1
    Build2
    相应地更新了这个问题。如果您定义自己的
    main
    ,您可以创建一个全局集合,并从每个基准中引用它

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

    BENCHMARK\u REGISTER\u F(BuildFixture,Build)->Arg(10)->Arg(20)
    
    如果您定义自己的
    main
    ,您可以创建一个全局集合,并从每个基准中引用它

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

    BENCHMARK\u REGISTER\u F(BuildFixture,Build)->Arg(10)->Arg(20)
    
    在传统的测试框架中,您可能需要某种共享夹具。似乎有人支持这一点。请参阅github的这个问题:@Voo有趣。我的理解在这里不是很好。是否会为每个迭代创建一个新的
    状态
    对象?在这种情况下,每次迭代最终都会读取完整的文件。我希望更多的人能够一次读取该文件,并在多个基准测试场景中使用它。在传统的测试框架中,您可能需要某种共享夹具。似乎有人支持这一点。请参阅github的这个问题:@Voo有趣。我的理解在这里不是很好。是否会为每个迭代创建一个新的
    状态
    对象?在这种情况下,每次迭代最终都会读取完整的文件。我希望能有更多的人一次读取该文件,并在多个基准测试场景中使用它。全局收集将起作用。不幸的是,我有不同的基准,所以我不能使用
    BENCHMARK\u REGISTER\u F(BuildFixture,Build)->Arg(10)->Arg(20)
    格式。我应该澄清一下,在问题中,如果您使用
    设置
    拆卸
    而不是ctor和dtor,您是否看到了相同的行为?全局收集将起作用。不幸的是,我有不同的基准,所以我不能使用
    BENCHMARK\u REGISTER\u F(BuildFixture,Build)->Arg(10)->Arg(20)
    格式。我应该澄清一下,在问题中,如果您使用
    设置
    拆卸
    而不是ctor和dtor,您是否看到相同的行为?
    Constructor
    Constructor
    .. (benchmarking outputs)..
    Destroy collection                                                                              
    Destroy collection