【发布时间】:2021-01-05 14:06:55
【问题描述】:
我正在尝试通过使用 boost::container::allocators 来提高性能。
#include <chrono>
#include <set>
#include <vector>
#include <iostream>
#include <boost/container/pmr/vector.hpp>
#include <boost/container/pmr/set.hpp>
#include <boost/container/allocator.hpp>
#include <boost/container/node_allocator.hpp>
#include <boost/container/adaptive_pool.hpp>
template<typename Vector>
void pushBackTest(bool makeReserve)
{
Vector v;
const std::size_t count = 10000000;
if (makeReserve)
{
v.reserve(count);
}
auto start = std::chrono::high_resolution_clock::now();
for (std::size_t i = 0 ; i < count ; ++i)
{
v.push_back(typename Vector::value_type{});
}
auto end = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double> duration = end - start;
std::cout << duration.count() << std::endl;
}
template<typename Set>
void setInsertTest()
{
Set v;
const std::size_t count = 1000000;
auto start = std::chrono::high_resolution_clock::now();
for (std::size_t i = 0 ; i < count ; ++i)
{
v.insert(std::rand());
}
auto end = std::chrono::high_resolution_clock::now();
const std::chrono::duration<double> duration = end - start;
std::cout << duration.count() << std::endl;
}
int main()
{
std::srand((unsigned)std::time(nullptr));
std::cout << "Vector" << std::endl;
std::cout << "No reserve" << std::endl;
pushBackTest<std::vector<int>>(false);
pushBackTest<std::vector<int, boost::container::allocator<int>>>(false);
pushBackTest<boost::container::vector<int, boost::container::allocator<int>>>(false);
pushBackTest<boost::container::vector<int, boost::container::allocator<int>>>(false);
pushBackTest<boost::container::pmr::vector<int>>(false);
std::cout << "Reserve" << std::endl;
pushBackTest<std::vector<int>>(true);
pushBackTest<std::vector<int, boost::container::allocator<int>>>(true);
pushBackTest<boost::container::vector<int, boost::container::allocator<int>>>(true);
pushBackTest<boost::container::vector<int, boost::container::allocator<int>>>(true);
pushBackTest<boost::container::pmr::vector<int>>(true);
std::cout << "Set" << std::endl;
setInsertTest<std::set<int>>();
setInsertTest<std::set<int, std::less<int>, boost::container::node_allocator<int>>>();
setInsertTest<std::set<int, std::less<int>, boost::container::adaptive_pool<int>>>();
setInsertTest<boost::container::set<int>>();
setInsertTest<boost::container::set<int, std::less<int>, boost::container::node_allocator<int>>>();
setInsertTest<boost::container::set<int, std::less<int>, boost::container::adaptive_pool<int>>>();
setInsertTest<boost::container::pmr::set<int>>();
return 0;
}
用clang++12 prog.cc -Wall -Wextra -O2 -march=native -I/opt/wandbox/boost-1.73.0/clang-head/include -std=c++14编译
结果:
Vector
No reserve
0.10387
0.095851
0.104992
0.0982694
0.102469
Reserve
0.0372922
0.0489831
0.0518053
0.052593
0.0680981
Set
0.760118
0.7739
0.769929
1.09121
0.685224
0.747359
1.18725
据我所知,分配器并没有带来任何性能提升。
任何人都可以看看并告诉我我做错了什么吗?
【问题讨论】:
-
您需要创建并发布minimal reproducible example。问题应该是独立的。您还需要显示您的结果以及用于编译的编译器标志和测量方法。
-
当您进行任何性能测量时 do not forget enable optimizations
-O3(增益快 6-10 倍)。