预分配列表
Pre-Allocated List
我有两个对象列表
list<QC> qcB;
list<QC> qcS;
并且正在使用 emplace_back() 将项目插入其中。因为我意识到插入项目花费的时间太长,所以我开始搜索我从未使用过的分配器,看看我是否能够使事情变得更快 运行。我在某处读到我可以获得列表的默认分配器,并提前在其上分配 space,所以我尝试在其中一个列表中分配 space:
qcB.get_allocator().allocate(100000);
我不确定这是否应该起作用,但事实是 emplace_back() 对两个列表花费相同的时间,即使其中一个正在分配 space 事先.
这应该有效吗?这应该以不同的方式完成,而不是尝试在默认分配器中分配 space 吗?我不时清理列表,这可能会影响分配的 space?
感谢您的帮助。
如果你说的是标准库list
,它通常是链表算法或类似算法。
假设你已经做了很好的分析并且插入确实是问题所在,并且假设你只想做 emplace_back
调用。然后使用 vector
,它允许您调用 reserve
并且应该有更多的性能。
vector<QC> qcB;
qcB.reserve(10000);
但我担心你的实际瓶颈是对象 QC
初始化,而这不能 reserve
d。在这种情况下,您可以预初始化对象(如果初始化对象然后将实际数据放入其中是有意义的)。
像这样(快速和肮脏的草稿):
vector<QC> qcB;
qcB.resize(10000);
for (int i = 0; i < 10000; ++i) {
qcB[i].populate_object();
}
我有两个对象列表
list<QC> qcB;
list<QC> qcS;
并且正在使用 emplace_back() 将项目插入其中。因为我意识到插入项目花费的时间太长,所以我开始搜索我从未使用过的分配器,看看我是否能够使事情变得更快 运行。我在某处读到我可以获得列表的默认分配器,并提前在其上分配 space,所以我尝试在其中一个列表中分配 space:
qcB.get_allocator().allocate(100000);
我不确定这是否应该起作用,但事实是 emplace_back() 对两个列表花费相同的时间,即使其中一个正在分配 space 事先.
这应该有效吗?这应该以不同的方式完成,而不是尝试在默认分配器中分配 space 吗?我不时清理列表,这可能会影响分配的 space?
感谢您的帮助。
如果你说的是标准库list
,它通常是链表算法或类似算法。
假设你已经做了很好的分析并且插入确实是问题所在,并且假设你只想做 emplace_back
调用。然后使用 vector
,它允许您调用 reserve
并且应该有更多的性能。
vector<QC> qcB;
qcB.reserve(10000);
但我担心你的实际瓶颈是对象 QC
初始化,而这不能 reserve
d。在这种情况下,您可以预初始化对象(如果初始化对象然后将实际数据放入其中是有意义的)。
像这样(快速和肮脏的草稿):
vector<QC> qcB;
qcB.resize(10000);
for (int i = 0; i < 10000; ++i) {
qcB[i].populate_object();
}