C++ googlebenchmarkfixture:跨多个基准的重用向量
我想在加载一个大文件后使用google基准库运行多个基准测试。为此,我使用以下代码。函数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
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
函数)我需要注册的基准是不同的。我不希望将不同的参数传递给同一个基准。我已经用
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