【发布时间】:2013-07-02 09:06:32
【问题描述】:
我正在使用 C++ 实现配对堆,我从这里获取: http://home.fnal.gov/~stoughto/build/graphviz-2.22.2/lib/vpsc/pairingheap/PairingHeap.h http://home.fnal.gov/~stoughto/build/graphviz-2.22.2/lib/vpsc/pairingheap/PairingHeap.cpp
我已经将 PairingHeap 与 std::priority_queue 进行了比较 结果如下:
gcc 4.7 -O3,核心 i7 2.4Ghz rdstc 指令来测量周期
-------------------------------------------------------------------------------
for 100.000 elements:
o std::priority_queue<int>
- insert: 9,800,415 cycles
- extract: 29,712,818 cycles
- total: 39,513,233 cycles [0.031secs]
o PairingHeap<int>
- insert: 34,381,467 cycles
- extract: 259,986,113 cycles
- total: 294,367,580 cycles [0.125secs]
-------------------------------------------------------------------------------
for 1.000.000 elements:
o std::priority_queue<int>
- insert: 95,954,533 cycles
- extract: 518,546,747 cycles
- total: 614,501,280 cycles [0.296secs]
o PairingHeap<int>
- insert: 344,453,782 cycles
- extract: 3,856,344,199 cycles
- total: 4,200,797,981 cycles [1.593secs]
-------------------------------------------------------------------------------
for 10.000.000 elements:
o std::priority_queue<int>
- insert: 999,836,450 cycles
- extract: 10,634,407,049 cycles
- total: 11,634,243,499 cycles [4.390secs]
o PairingHeap<int>
- insert: 3,441,903,781 cycles
- extract: 61,166,421,272 cycles
- total: 64,608,325,053 cycles [24.187secs]
配对堆应该比 std::priority_queue 更快,因为它应该渐近更快 操作,但在这里配对堆非常慢。 我认为这是因为 std::priority_queue 在引擎盖下使用了一个向量,而这更多 缓存友好,而不是像配对堆那样为每个整数分配节点。
所以,我的问题是:渐近更好的数据结构能否(很大程度上)被更差的数据结构击败, 仅仅因为它们对缓存更友好? 在更复杂的数据结构(例如配对堆)上花费大量时间真的值得吗? 默认的 std::priority_queue 可以在很大程度上比它快吗?
我只是没有考虑到我使用的 Pairing heap 的实现只是废话, 但似乎不是,因为我尝试过的其他实现更糟糕! 想法?
【问题讨论】:
标签: c++ performance data-structures performance-testing cpu-cache