Я Трингом реализации в C++ из спаривания Heap, который я взял отсюда: 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Сопряжения Heap против станда :: priority_queue
Я сравнил, что PairingHeap против станда :: priority_queue и эти результаты:
НКУ 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 может в значительной степени быстрее, чем он?
Я просто не считал, что реализация кучи спаривания, которую я использовал, просто дерьмо, , но, похоже, это не так, потому что другие реализации, которые я пробовал, еще хуже! Мысли?