【发布时间】:2017-06-27 16:34:54
【问题描述】:
用例:我想为一个 Linux 程序实现一个非常有效的发送队列,该程序在网络测试程序中每秒发送许多速率受限的大量 UDP 数据包流。目前,我使用一个
priority_queue< pair<timespec, int>,
std::vector<pair<timespec, int>>,
std::greater<pair<timespec, int>> >
程序运行正常且速度很快。但我希望能够在队列前面弹出并在一个操作中添加一个新元素,即每个 pop/emplace 对只有一个 re-heapify。否则pop会重新heapify,然后emplace会直接re-heapify。
这可以用 std::make_heap、std::push_heap 和 std::pop_heap 完成吗?还是我必须自己动手?我当前的程序确实在 std::priority_queue 上弹出,然后是 emplace,其成本为 '2*O(log(N))'。
FWIW,当前程序在这里:https://github.com/alapaa/timestamping/tree/send_queue
带有队列的实际发送者是这个 src 文件: https://github.com/alapaa/timestamping/blob/send_queue/manysock/sender.cpp
【问题讨论】:
-
解决方案指出为预先存在的副本(jxh:s 答案)效果很好。我将它实现为 std::make_heap 之上的一个小型包装类,请参阅github.com/alapaa/timestamping/blob/send_queue/manysock/…