我正在学习内存池,并试图在我的项目中使用boost::pool_allocator。根据文献资料的说法,我做了一个关于时间成本的小测试:
template <typename Alloc>
void test()
{
using namespace std::chrono;
auto t0 = high_resolution_clock::now();
for (int i = 0; i < 1000; ++i) {
std::vector<int, Alloc> vec;
for (int j = 0; j < 10000; ++j)
vec.push_back(i + j);
}
auto t1 = high_resolution_clock::now();
auto time_ms = duration<double>(t1 - t0).count() * 1e3;
cout << "time cost: " << time_ms << " ms" << endl;
}
int main()
{
test<std::allocator<int>>();
test<boost::pool_allocator<int>>();
}结果是:
time cost: 3.97602 ms
time cost: 91.3943 ms助推医生说:
当小对象有大量的分配和去分配时,通常使用池。
因此,我预计boost::pool_allocator比上面代码中的std::allocator花费更少的时间,但是测试结果显示它更糟糕。
我用错了boost::pool_allocator吗?在什么情况下,我可以通过使用内存池(或者仅仅是Boost池/缓冲池_分配程序)来获得加速?
发布于 2022-02-10 07:43:03
当小对象有大量的分配和去分配时,通常使用池。
vector不分配“小对象”。vector<T>分配数组。或者更具体地说,在内存块中分配的单个数组足够大,足以容纳(至少) sizeof(T) * size字节。
在这种分配模式中,池分配器非常糟糕。
https://stackoverflow.com/questions/71061315
复制相似问题