【发布时间】:2020-10-01 09:54:04
【问题描述】:
我正在测试 std::priority_queue 的优先级队列实现与使用 std::set 的实现之间的性能差异。
我已经重载了
在这两种实现中,我都调用这个“timeQueue”函数超过 200 次迭代并平均获得的时间。我看到 std::set 的实现速度提高了大约 38%。可能是什么原因。谢谢。
(这些仅用于测试目的)
std::set 实现
void timeQueue()
{
NodeData res;
for(int i=1;i<=500000;i++)
{
auto score = rand() %10000000;
NodeData n1 = {i,i,score,i,i};
// push:
priorityList.insert(n1);
}
for(int i=1;i<=500000;i++)
{
std::set<NodeData>::iterator it = priorityList.begin();
// top:
auto s = it->id;
// pop:
priorityList.erase(it);
}
}
同样,std::priority_queue
void timeQueue()
{
NodeData res;
for(int i=1;i<=500000;i++)
{
auto score = rand() % 10000;
NodeData n1 = {i,1,score,1,1};
priorityList.push(n1);
}
for(int i=1;i<=500000;i++)
{
res = priorityList.top();
priorityList.pop();
//std::cout<<res.id<<std::endl;
}
}
};
【问题讨论】:
-
什么是 %push、%top、%pop?
-
另外,制作minimal reproducible examples。为什么在两个测试中不使用相同的模数?您最好在运行测试之前生成测试数据,然后提供相同的数据。您现在花时间计算测试数据 - 在两个测试中您的计算方式不同。
-
@user253751 使用 std::set 时,它们是 push、pop、top 等价物
-
请注意,关于基准测试,性能结果可能会有很大不同。实际上,容器针对不同的情况。例如,std::priority_queue 可以由许多元素以比 std::set 更有效的方式构造。许多元素的插入也是如此。对于 std::priority_queue,这两种情况都是在
O(n)时间计算的,而对于 std::set 是O(n log n)。 -
@JérômeRichard 由于 0(n log n) 插入时间,我预计 std::stl 的性能会最差。但我对我得到的结果感到困惑。
标签: c++ performance set priority-queue