【问题标题】:Performance difference between std::priority_queue vs std::setstd::priority_queue 与 std::set 之间的性能差异
【发布时间】: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


【解决方案1】:

我认为造成这种性能差异的原因在于 set 元素是随机生成的,如果偶然生成的元素不是唯一的,则不会插入它们。因此实际上,std::set 的元素将比 std::priority_queue 少。因此执行时间更短。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2011-11-21
    • 2017-09-12
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多