pairing_heap 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -101,9 +101,12 @@ This API is a drop-in replacement of [lazy_priority_queue](https://github.com/ma
101
101
  | dequeue | O(n) | O(log n) |
102
102
  | * change_priority | O(1) | o(log n) |
103
103
  | * delete | O(n) | O(log n) |
104
+ | ^ merge | O(1) | O(1) |
104
105
 
105
106
  `*` Not available in `SimplePairingHeap`
106
107
 
108
+ `^` Only available in `SimplePairingHeap`
109
+
107
110
  ## Benchmarks
108
111
  I picked the three fastest pure Ruby priority queue implementations I was aware of for the comparison:
109
112
 
@@ -117,7 +120,7 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
117
120
  > A stress test of 1,000,000 operations: starting with 1,000 pushes/0 pops, following 999 pushes/1 pop, and so on till 0 pushes/1000 pops.
118
121
  <table>
119
122
  <tr>
120
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
123
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
121
124
  </tr>
122
125
  <tr>
123
126
  <th>Library</th>
@@ -127,36 +130,36 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
127
130
  </tr>
128
131
  <tr>
129
132
  <td>pairing_heap (SimplePairingHeap)</td>
130
- <td>23</td>
131
- <td>62.014773</td>
132
- <td>0.371</td>
133
+ <td>26</td>
134
+ <td>62.249427</td>
135
+ <td>0.419</td>
133
136
  </tr>
134
137
  <tr>
135
138
  <td>pairing_heap (PairingHeap)</td>
136
- <td>16</td>
137
- <td>63.135240</td>
138
- <td>0.253(1.46x slower)</td>
139
+ <td>17</td>
140
+ <td>61.624806</td>
141
+ <td>0.276(1.52x slower)</td>
139
142
  </tr>
140
143
  <tr>
141
144
  <td>rb_heap</td>
142
- <td>14</td>
143
- <td>61.123304</td>
144
- <td>0.229(1.62x slower)</td>
145
+ <td>16</td>
146
+ <td>63.656502</td>
147
+ <td>0.251(1.67x slower)</td>
145
148
  </tr>
146
149
  <tr>
147
150
  <td>lazy_priority_queue</td>
148
- <td>10</td>
149
- <td>66.208647</td>
150
- <td>0.151(2.46x slower)</td>
151
+ <td>7</td>
152
+ <td>63.339192</td>
153
+ <td>0.111(3.79x slower)</td>
151
154
  </tr>
152
155
  <tr>
153
156
  <td>Fibonacci</td>
154
- <td>8</td>
155
- <td>66.353147</td>
156
- <td>0.121(3.08x slower)</td>
157
+ <td>5</td>
158
+ <td>69.010737</td>
159
+ <td>0.073(5.77x slower)</td>
157
160
  </tr>
158
161
  <tr>
159
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
162
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
160
163
  </tr>
161
164
  <tr>
162
165
  <th>Library</th>
@@ -166,36 +169,36 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
166
169
  </tr>
167
170
  <tr>
168
171
  <td>pairing_heap (SimplePairingHeap)</td>
169
- <td>25</td>
170
- <td>60.423579</td>
171
- <td>0.414</td>
172
+ <td>39</td>
173
+ <td>60.725689</td>
174
+ <td>0.642</td>
172
175
  </tr>
173
176
  <tr>
174
177
  <td>rb_heap</td>
175
- <td>19</td>
176
- <td>60.869907</td>
177
- <td>0.312(1.33x slower)</td>
178
+ <td>31</td>
179
+ <td>60.370348</td>
180
+ <td>0.514(1.25x slower)</td>
178
181
  </tr>
179
182
  <tr>
180
183
  <td>pairing_heap (PairingHeap)</td>
181
- <td>17</td>
182
- <td>61.389127</td>
183
- <td>0.277(1.49x slower)</td>
184
+ <td>25</td>
185
+ <td>62.269577</td>
186
+ <td>0.402(1.6x slower)</td>
184
187
  </tr>
185
188
  <tr>
186
- <td>Fibonacci</td>
187
- <td>14</td>
188
- <td>64.417807</td>
189
- <td>0.217(1.90x slower)</td>
189
+ <td>lazy_priority_queue</td>
190
+ <td>9</td>
191
+ <td>62.144710</td>
192
+ <td>0.145(4.43x slower)</td>
190
193
  </tr>
191
194
  <tr>
192
- <td>lazy_priority_queue</td>
193
- <td>11</td>
194
- <td>63.151856</td>
195
- <td>0.174(2.38x slower)</td>
195
+ <td>Fibonacci</td>
196
+ <td>8</td>
197
+ <td>65.064385</td>
198
+ <td>0.123(5.22x slower)</td>
196
199
  </tr>
197
200
  <tr>
198
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
201
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
199
202
  </tr>
200
203
  <tr>
201
204
  <th>Library</th>
@@ -205,36 +208,36 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
205
208
  </tr>
206
209
  <tr>
207
210
  <td>pairing_heap (SimplePairingHeap)</td>
208
- <td>47</td>
209
- <td>60.391633</td>
210
- <td>0.778</td>
211
+ <td>43</td>
212
+ <td>60.734661</td>
213
+ <td>0.709</td>
211
214
  </tr>
212
215
  <tr>
213
216
  <td>rb_heap</td>
214
217
  <td>34</td>
215
- <td>60.878639</td>
216
- <td>0.559(1.39x slower)</td>
218
+ <td>61.677228</td>
219
+ <td>0.552(1.28x slower)</td>
217
220
  </tr>
218
221
  <tr>
219
222
  <td>pairing_heap (PairingHeap)</td>
220
- <td>32</td>
221
- <td>61.211985</td>
222
- <td>0.523(1.49x slower)</td>
223
+ <td>28</td>
224
+ <td>61.284382</td>
225
+ <td>0.458(1.55x slower)</td>
223
226
  </tr>
224
227
  <tr>
225
228
  <td>Fibonacci</td>
226
- <td>23</td>
227
- <td>60.297670</td>
228
- <td>0.382(2.04x slower)</td>
229
+ <td>22</td>
230
+ <td>61.396897</td>
231
+ <td>0.359(1.97x slower)</td>
229
232
  </tr>
230
233
  <tr>
231
234
  <td>lazy_priority_queue</td>
232
- <td>23</td>
233
- <td>61.973538</td>
234
- <td>0.371(2.10x slower)</td>
235
+ <td>20</td>
236
+ <td>61.841463</td>
237
+ <td>0.324(2.19x slower)</td>
235
238
  </tr>
236
239
  <tr>
237
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
240
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
238
241
  </tr>
239
242
  <tr>
240
243
  <th>Library</th>
@@ -244,33 +247,33 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
244
247
  </tr>
245
248
  <tr>
246
249
  <td>pairing_heap (SimplePairingHeap)</td>
247
- <td>206</td>
248
- <td>60.191686</td>
249
- <td>3.433</td>
250
+ <td>202</td>
251
+ <td>60.225639</td>
252
+ <td>3.388</td>
250
253
  </tr>
251
254
  <tr>
252
255
  <td>rb_heap</td>
253
- <td>97</td>
254
- <td>60.134011</td>
255
- <td>1.614(1.93x slower)</td>
256
+ <td>140</td>
257
+ <td>60.190881</td>
258
+ <td>2.357(1.44x slower)</td>
256
259
  </tr>
257
260
  <tr>
258
261
  <td>pairing_heap (PairingHeap)</td>
259
- <td>85</td>
260
- <td>60.193608s</td>
261
- <td>1.434(2.40x slower)</td>
262
+ <td>100</td>
263
+ <td>60.373610</td>
264
+ <td>1.692(2x slower)</td>
262
265
  </tr>
263
266
  <tr>
264
267
  <td>lazy_priority_queue</td>
265
- <td>19</td>
266
- <td>63.212429</td>
267
- <td>0.301(11.45x slower)</td>
268
+ <td>31</td>
269
+ <td>61.179244</td>
270
+ <td>0.510(6.65x slower)</td>
268
271
  </tr>
269
272
  <tr>
270
273
  <td>Fibonacci</td>
271
- <td>2</td>
272
- <td>83.508571</td>
273
- <td>0.024(143.70x slower)</td>
274
+ <td>11</td>
275
+ <td>64.413419</td>
276
+ <td>0.171(19.81x slower)</td>
274
277
  </tr>
275
278
  </table>
276
279
 
@@ -278,7 +281,7 @@ Original performance test from [lazy_priority_queue](https://github.com/matiasba
278
281
  A stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_priorities/0 pops, following 999 pushes/999 change_priorities/1 pop, and so on till 0 pushes/0 change_priorities/1000 pops.
279
282
  <table>
280
283
  <tr>
281
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
284
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
282
285
  </tr>
283
286
  <tr>
284
287
  <th>Library</th>
@@ -289,23 +292,23 @@ A stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_pr
289
292
  <tr>
290
293
  <td>pairing_heap</td>
291
294
  <td>15</td>
292
- <td>62.946988</td>
293
- <td>0.238</td>
295
+ <td>60.817878</td>
296
+ <td>0.247</td>
294
297
  </tr>
295
298
  <tr>
296
299
  <td>lazy_priority_queue</td>
297
- <td>9</td>
298
- <td>61.876691</td>
299
- <td>0.145(1.64x slower)</td>
300
+ <td>7</td>
301
+ <td>63.990376s</td>
302
+ <td>0.109(2.26x slower)</td>
300
303
  </tr>
301
304
  <tr>
302
305
  <td>Fibonacci</td>
303
- <td>8</td>
304
- <td>67.809982</td>
305
- <td>0.118(2.02x slower)</td>
306
+ <td>5</td>
307
+ <td>70.148980s</td>
308
+ <td>0.071(3.47x slower)</td>
306
309
  </tr>
307
310
  <tr>
308
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
311
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
309
312
  </tr>
310
313
  <tr>
311
314
  <th>Library</th>
@@ -315,24 +318,24 @@ A stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_pr
315
318
  </tr>
316
319
  <tr>
317
320
  <td>pairing_heap</td>
318
- <td>16</td>
319
- <td>62.576693</td>
320
- <td>0.256</td>
321
+ <td>22</td>
322
+ <td>62.429264</td>
323
+ <td>0.353</td>
321
324
  </tr>
322
325
  <tr>
323
- <td>Fibonacci</td>
324
- <td>13</td>
325
- <td>63.164614</td>
326
- <td>0.206(1.24x slower)</td>
326
+ <td>lazy_priority_queue</td>
327
+ <td>9</td>
328
+ <td>63.464818</td>
329
+ <td>0.142(2.49x slower)</td>
327
330
  </tr>
328
331
  <tr>
329
- <td>lazy_priority_queue</td>
330
- <td>10</td>
331
- <td>63.172995s</td>
332
- <td>0.158(1.62x slower)</td>
332
+ <td>Fibonacci</td>
333
+ <td>8</td>
334
+ <td>67.908812</td>
335
+ <td>0.118(2.99x slower)</td>
333
336
  </tr>
334
337
  <tr>
335
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
338
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
336
339
  </tr>
337
340
  <tr>
338
341
  <th>Library</th>
@@ -342,24 +345,24 @@ A stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_pr
342
345
  </tr>
343
346
  <tr>
344
347
  <td>pairing_heap</td>
345
- <td>28</td>
346
- <td>60.280368</td>
347
- <td>0.465</td>
348
+ <td>27</td>
349
+ <td>61.709517</td>
350
+ <td>0.438</td>
348
351
  </tr>
349
352
  <tr>
350
353
  <td>Fibonacci</td>
351
- <td>22</td>
352
- <td>61.405561</td>
353
- <td>0.465(1.30x slower)</td>
354
+ <td>20</td>
355
+ <td>61.495636</td>
356
+ <td>0.326(1.34x slower)</td>
354
357
  </tr>
355
358
  <tr>
356
359
  <td>lazy_priority_queue</td>
357
- <td>20</td>
358
- <td>60.397535</td>
359
- <td>0.331(1.40x slower)</td>
360
+ <td>19</td>
361
+ <td>63.401601</td>
362
+ <td>0.309(1.46x slower)</td>
360
363
  </tr>
361
364
  <tr>
362
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
365
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
363
366
  </tr>
364
367
  <tr>
365
368
  <th>Library</th>
@@ -369,21 +372,21 @@ A stress test of 1,501,500 operations: starting with 1,000 pushes/1000 change_pr
369
372
  </tr>
370
373
  <tr>
371
374
  <td>pairing_heap</td>
372
- <td>70</td>
373
- <td>60.663184</td>
374
- <td>1.160</td>
375
+ <td>93</td>
376
+ <td>60.125750</td>
377
+ <td>1.577</td>
375
378
  </tr>
376
379
  <tr>
377
380
  <td>lazy_priority_queue</td>
378
- <td>23</td>
379
- <td>60.474587</td>
380
- <td>0.382(3.04x slower)</td>
381
+ <td>26</td>
382
+ <td>62.372660s</td>
383
+ <td>0.419(3.77x slower)</td>
381
384
  </tr>
382
385
  <tr>
383
386
  <td>Fibonacci</td>
384
- <td>2</td>
385
- <td>74.873854</td>
386
- <td>0.027(43.44x slower)</td>
387
+ <td>11</td>
388
+ <td>62.620172s</td>
389
+ <td>0.177(8.92x slower)</td>
387
390
  </tr>
388
391
  </table>
389
392
 
@@ -393,7 +396,7 @@ Start with 500 pushes, then:
393
396
  * If does not support changing priority 500 push calls, then 1000 pops
394
397
  <table>
395
398
  <tr>
396
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
399
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
397
400
  </tr>
398
401
  <tr>
399
402
  <th>Library</th>
@@ -401,26 +404,26 @@ Start with 500 pushes, then:
401
404
  </tr>
402
405
  <tr>
403
406
  <td>pairing_heap (PairingHeap)</td>
404
- <td>436.4</td>
407
+ <td>748.9</td>
405
408
  </tr>
406
409
  <tr>
407
410
  <td>lazy_priority_queue</td>
408
- <td>380.2(1.94x slower)</td>
411
+ <td>388.6(1.93x slower)</td>
409
412
  </tr>
410
413
  <tr>
411
414
  <td>pairing_heap (SimplePairingHeap)</td>
412
- <td>339.9.02(2.17x slower)</td>
415
+ <td>336.2(2.23x slower)</td>
413
416
  </tr>
414
417
  <tr>
415
418
  <td>Fibonacci</td>
416
- <td>313.9(2.35x slower)</td>
419
+ <td>225.9(3.31x slower)</td>
417
420
  </tr>
418
421
  <tr>
419
422
  <td>rb_heap</td>
420
- <td>194.7(3.78 slower)</td>
423
+ <td>215.2(3.48x slower)</td>
421
424
  </tr>
422
425
  <tr>
423
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
426
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
424
427
  </tr>
425
428
  <tr>
426
429
  <th>Library</th>
@@ -428,26 +431,26 @@ Start with 500 pushes, then:
428
431
  </tr>
429
432
  <tr>
430
433
  <td>pairing_heap</td>
431
- <td>854.6</td>
434
+ <td>1276</td>
432
435
  </tr>
433
436
  <tr>
434
- <td>Fibonacci</td>
435
- <td>651.3(1.31x slower)</td>
437
+ <td>pairing_heap(SimplePairingHeap)</td>
438
+ <td>625.6(2.04x slower)</td>
436
439
  </tr>
437
440
  <tr>
438
441
  <td>lazy_priority_queue</td>
439
- <td>453.6(1.88x slower)</td>
442
+ <td>533.36(2.39x slower)</td>
440
443
  </tr>
441
444
  <tr>
442
- <td>pairing_heap(SimplePairingHeap)</td>
443
- <td>390.9(2.19x slower)</td>
445
+ <td>Fibonacci</td>
446
+ <td>495.519(2.57x slower)</td>
444
447
  </tr>
445
448
  <tr>
446
449
  <td>rb_heap</td>
447
- <td>268.8(3.18x slower)</td>
450
+ <td>453.323(2.81x slower)</td>
448
451
  </tr>
449
452
  <tr>
450
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
453
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
451
454
  </tr>
452
455
  <tr>
453
456
  <th>Library</th>
@@ -455,26 +458,26 @@ Start with 500 pushes, then:
455
458
  </tr>
456
459
  <tr>
457
460
  <td>pairing_heap(PairingHeap)</td>
458
- <td>1591</td>
461
+ <td>1377</td>
459
462
  </tr>
460
463
  <tr>
461
464
  <td>Fibonacci</td>
462
- <td>1092(1.46x slower)</td>
465
+ <td>1088(1.27x slower)</td>
463
466
  </tr>
464
467
  <tr>
465
468
  <td>lazy_priority_queue</td>
466
- <td>986(1.61x slower)</td>
469
+ <td>953.935(1.44x slower)</td>
467
470
  </tr>
468
471
  <tr>
469
472
  <td>pairing_heap(SimplePairingHeap)</td>
470
- <td>562(2.37x slower)</td>
473
+ <td>621.35(2.22x slower)</td>
471
474
  </tr>
472
475
  <tr>
473
476
  <td>rb_heap</td>
474
- <td>623(2.55x slower)</td>
477
+ <td>595.11(2.31x slower)</td>
475
478
  </tr>
476
479
  <tr>
477
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
480
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
478
481
  </tr>
479
482
  <tr>
480
483
  <th>Library</th>
@@ -482,135 +485,23 @@ Start with 500 pushes, then:
482
485
  </tr>
483
486
  <tr>
484
487
  <td>pairing_heap(PairingHeap)</td>
485
- <td>7404</td>
488
+ <td>12712</td>
486
489
  </tr>
487
490
  <tr>
488
491
  <td>pairing_heap(SimplePairingHeap)</td>
489
- <td>5104(1.45x slower)</td>
492
+ <td>9447(1.35x slower)</td>
490
493
  </tr>
491
494
  <tr>
492
495
  <td>rb_heap</td>
493
- <td>1575(4.70x slower)</td>
494
- </tr>
495
- <tr>
496
- <td>Fibonacci</td>
497
- <td>1258(5.88x slower)</td>
498
- </tr>
499
- <tr>
500
- <td>lazy_priority_queue</td>
501
- <td>1004(7.38x slower)</td>
502
- </tr>
503
- </table>
504
-
505
- ### Dijkstra's algorithm with RGL [source code](./test/performance_rgl.rb)
506
- <table>
507
- <tr>
508
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
509
- </tr>
510
- <tr>
511
- <th>Library</th>
512
- <th>Iterations</th>
513
- <th>Seconds</th>
514
- <th>Iterations per second</th>
515
- </tr>
516
- <tr>
517
- <td>pairing_heap</td>
518
- <td>9</td>
519
- <td>61.469343</td>
520
- <td>0.116</td>
521
- </tr>
522
- <tr>
523
- <td>lazy_priority_queue</td>
524
- <td>8</td>
525
- <td>64.312672</td>
526
- <td>0.125(1.18x slower)</td>
527
- </tr>
528
- <tr>
529
- <td>Fibonacci</td>
530
- <td>7</td>
531
- <td>60.555716</td>
532
- <td>0.116(1.27x slower)</td>
533
- </tr>
534
- <tr>
535
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
536
- </tr>
537
- <tr>
538
- <th>Library</th>
539
- <th>Iterations</th>
540
- <th>Seconds</th>
541
- <th>Iterations per second</th>
542
- </tr>
543
- <tr>
544
- <td>pairing_heap</td>
545
- <td>10</td>
546
- <td>65.160945s</td>
547
- <td>0.154</td>
548
- </tr>
549
- <tr>
550
- <td>Fibonacci</td>
551
- <td>9</td>
552
- <td>61.950587</td>
553
- <td>0.145(1.06x slower)</td>
554
- </tr>
555
- <tr>
556
- <td>lazy_priority_queue</td>
557
- <td>9</td>
558
- <td>66.592123</td>
559
- <td>0.135(1.14x slower)</td>
560
- </tr>
561
- <tr>
562
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
563
- </tr>
564
- <tr>
565
- <th>Library</th>
566
- <th>Iterations</th>
567
- <th>Seconds</th>
568
- <th>Iterations per second</th>
569
- </tr>
570
- <tr>
571
- <td>lazy_priority_queue</td>
572
- <td>20</td>
573
- <td>61.149944</td>
574
- <td>0.328</td>
575
- </tr>
576
- <tr>
577
- <td>pairing_heap</td>
578
- <td>20</td>
579
- <td>61.210225s</td>
580
- <td>0.328</td>
496
+ <td>4009(3.17x slower)</td>
581
497
  </tr>
582
498
  <tr>
583
499
  <td>Fibonacci</td>
584
- <td>18</td>
585
- <td>62.330882</td>
586
- <td>0.292(1.12x slower)</td>
587
- </tr>
588
- <tr>
589
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
590
- </tr>
591
- <tr>
592
- <th>Library</th>
593
- <th>Iterations</th>
594
- <th>Seconds</th>
595
- <th>Iterations per second</th>
596
- </tr>
597
- <tr>
598
- <td>pairing_heap</td>
599
- <td>59</td>
600
- <td>60.053843</td>
601
- <td>0.991</td>
500
+ <td>2793(4.55x slower)</td>
602
501
  </tr>
603
502
  <tr>
604
503
  <td>lazy_priority_queue</td>
605
- <td>34</td>
606
- <td>60.586461</td>
607
- <td>0.563(1.76x slower)</td>
608
- </tr>
609
- <tr>
610
- <td>Fibonacci</td>
611
- <td>31</td>
612
- <td>60.633711</td>
613
- <td>0.520(1.90x slower)</td>
504
+ <td>1188(10.7x slower)</td>
614
505
  </tr>
615
506
  </table>
616
507
 
@@ -618,7 +509,7 @@ Start with 500 pushes, then:
618
509
  Heaps that support change_priority operation use it. Heaps that do not support it use dijkstra implementation that do not rely on change_priority instead and do additional pops and pushes instead(see Dijkstra-NoDec from [Priority Queues and Dijkstra’s Algorithm](https://www3.cs.stonybrook.edu/~rezaul/papers/TR-07-54.pdf)).
619
510
  <table>
620
511
  <tr>
621
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
512
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
622
513
  </tr>
623
514
  <tr>
624
515
  <th>Library</th>
@@ -628,36 +519,36 @@ Heaps that support change_priority operation use it. Heaps that do not support i
628
519
  </tr>
629
520
  <tr>
630
521
  <td>pairing_heap (SimplePairingHeap)</td>
631
- <td>28</td>
632
- <td>62.100299</td>
633
- <td>0.451</td>
522
+ <td>41</td>
523
+ <td>60.100316</td>
524
+ <td>0.682</td>
634
525
  </tr>
635
526
  <tr>
636
527
  <td>pairing_heap (PairingHeap)</td>
637
- <td>23</td>
638
- <td>60.633153</td>
639
- <td>0.380(1.19x slower)</td>
528
+ <td>38</td>
529
+ <td>61.003607</td>
530
+ <td>0.623(1.09x slower)</td>
640
531
  </tr>
641
532
  <tr>
642
533
  <td>rb_heap</td>
643
- <td>14</td>
644
- <td>62.019763</td>
645
- <td>0.226(2.00x slower)</td>
534
+ <td>30</td>
535
+ <td>61.486216</td>
536
+ <td>0.488(1.40x slower)</td>
646
537
  </tr>
647
538
  <tr>
648
539
  <td>lazy_priority_queue</td>
649
- <td>11</td>
650
- <td>63.105064s</td>
651
- <td>0.174(2.58x slower)</td>
540
+ <td>23</td>
541
+ <td>60.251764</td>
542
+ <td>0.382(1.79x slower)</td>
652
543
  </tr>
653
544
  <tr>
654
545
  <td>Fibonacci</td>
655
- <td>10</td>
656
- <td>64.407187</td>
657
- <td>0.155(2.90x slower)</td>
546
+ <td>13</td>
547
+ <td>61.158622</td>
548
+ <td>0.213(3.21x slower)</td>
658
549
  </tr>
659
550
  <tr>
660
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
551
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
661
552
  </tr>
662
553
  <tr>
663
554
  <th>Library</th>
@@ -667,36 +558,36 @@ Heaps that support change_priority operation use it. Heaps that do not support i
667
558
  </tr>
668
559
  <tr>
669
560
  <td>pairing_heap (SimplePairingHeap)</td>
670
- <td>32</td>
671
- <td>61.289321</td>
672
- <td>0.522</td>
561
+ <td>65</td>
562
+ <td>60.805882</td>
563
+ <td>1.070</td>
673
564
  </tr>
674
565
  <tr>
675
566
  <td>pairing_heap (PairingHeap)</td>
676
- <td>26</td>
677
- <td>60.657625</td>
678
- <td>0.429(1.22x slower)</td>
567
+ <td>60</td>
568
+ <td>60.790842</td>
569
+ <td>0.987(1.08x slower)</td>
679
570
  </tr>
680
571
  <tr>
681
572
  <td>rb_heap</td>
682
- <td>19</td>
683
- <td>60.710888s</td>
684
- <td>0.313(1.67x slower)</td>
573
+ <td>54</td>
574
+ <td>60.917679</td>
575
+ <td>0.887(1.21x slower)</td>
685
576
  </tr>
686
577
  <tr>
687
- <td>Fibonacci</td>
688
- <td>19</td>
689
- <td>61.471203</td>
690
- <td>0.310(1.69x slower)</td>
578
+ <td>lazy_priority_queue</td>
579
+ <td>30</td>
580
+ <td>60.712786</td>
581
+ <td>0.495(2.16x slower)</td>
691
582
  </tr>
692
583
  <tr>
693
- <td>lazy_priority_queue</td>
694
- <td>12</td>
695
- <td>60.125779</td>
696
- <td>0.200(2.61x slower)</td>
584
+ <td>Fibonacci</td>
585
+ <td>24</td>
586
+ <td>61.900715</td>
587
+ <td>0.388(2.76x slower)</td>
697
588
  </tr>
698
589
  <tr>
699
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
590
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
700
591
  </tr>
701
592
  <tr>
702
593
  <th>Library</th>
@@ -705,37 +596,37 @@ Heaps that support change_priority operation use it. Heaps that do not support i
705
596
  <th>Iterations per second</th>
706
597
  </tr>
707
598
  <tr>
708
- <td>pairing_heap (SimplePairingHeap)</td>
709
- <td>46</td>
710
- <td>61.226924</td>
711
- <td>0.753</td>
599
+ <td>rb_heap</td>
600
+ <td>70</td>
601
+ <td>60.077928</td>
602
+ <td>1.168</td>
712
603
  </tr>
713
604
  <tr>
714
- <td>rb_heap</td>
715
- <td>38</td>
716
- <td>60.563995</td>
717
- <td>0.628(1.20x slower)</td>
605
+ <td>pairing_heap (SimplePairingHeap)</td>
606
+ <td>66</td>
607
+ <td>60.420935</td>
608
+ <td>1.094(1.07x slower)</td>
718
609
  </tr>
719
610
  <tr>
720
611
  <td>pairing_heap (PairingHeap)</td>
721
- <td>37</td>
722
- <td>60.928350</td>
723
- <td>0.608(1.24x slower)</td>
612
+ <td>64</td>
613
+ <td>60.114467</td>
614
+ <td>1.066(1.1x slower)</td>
724
615
  </tr>
725
616
  <tr>
726
617
  <td>Fibonacci</td>
727
- <td>28</td>
728
- <td>61.136970</td>
729
- <td>0.461(1.63x slower)</td>
618
+ <td>54</td>
619
+ <td>60.426971</td>
620
+ <td>0.898(1.30x slower)</td>
730
621
  </tr>
731
622
  <tr>
732
623
  <td>lazy_priority_queue</td>
733
- <td>22</td>
734
- <td>62.214796</td>
735
- <td>0.354(2.13x slower)</td>
624
+ <td>49</td>
625
+ <td>60.636963</td>
626
+ <td>0.809(1.44x slower)</td>
736
627
  </tr>
737
628
  <tr>
738
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
629
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
739
630
  </tr>
740
631
  <tr>
741
632
  <th>Library</th>
@@ -745,33 +636,33 @@ Heaps that support change_priority operation use it. Heaps that do not support i
745
636
  </tr>
746
637
  <tr>
747
638
  <td>pairing_heap (SimplePairingHeap)</td>
748
- <td>176</td>
749
- <td>60.029817</td>
750
- <td>3.006</td>
639
+ <td>288</td>
640
+ <td>60.102278</td>
641
+ <td>4.936</td>
751
642
  </tr>
752
643
  <tr>
753
644
  <td>pairing_heap (PairingHeap)</td>
754
- <td>124</td>
755
- <td>60.366607</td>
756
- <td>2.078(1.45x slower)</td>
645
+ <td>232</td>
646
+ <td>60.159057</td>
647
+ <td>3.936(1.25x slower)</td>
757
648
  </tr>
758
649
  <tr>
759
650
  <td>rb_heap</td>
760
- <td>95</td>
761
- <td>60.021043</td>
762
- <td>1.585(1.90x slower)</td>
651
+ <td>227</td>
652
+ <td>60.082482</td>
653
+ <td>3.881(1.27x slower)</td>
763
654
  </tr>
764
655
  <tr>
765
656
  <td>Fibonacci</td>
766
- <td>38</td>
767
- <td>60.020976</td>
768
- <td>0.636(4.72x slower)</td>
657
+ <td>101</td>
658
+ <td>60.076691</td>
659
+ <td>1.721(2.87x slower)</td>
769
660
  </tr>
770
661
  <tr>
771
662
  <td>lazy_priority_queue</td>
772
- <td>27</td>
773
- <td>61.349925</td>
774
- <td>0.445(6.75x slower)</td>
663
+ <td>66</td>
664
+ <td>60.771569</td>
665
+ <td>1.1(4.49x slower)</td>
775
666
  </tr>
776
667
  </table>
777
668
 
@@ -779,7 +670,7 @@ Heaps that support change_priority operation use it. Heaps that do not support i
779
670
  #### Change priority required
780
671
  <table>
781
672
  <tr>
782
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
673
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
783
674
  </tr>
784
675
  <tr>
785
676
  <th>Library</th>
@@ -791,14 +682,14 @@ Heaps that support change_priority operation use it. Heaps that do not support i
791
682
  </tr>
792
683
  <tr>
793
684
  <td>lazy_priority_queue</td>
794
- <td>1.688x slower</td>
685
+ <td>2.1x slower</td>
795
686
  </tr>
796
687
  <tr>
797
688
  <td>Fibonacci</td>
798
- <td>1.987x slower</td>
689
+ <td>3.38x slower</td>
799
690
  </tr>
800
691
  <tr>
801
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
692
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
802
693
  </tr>
803
694
  <tr>
804
695
  <th>Library</th>
@@ -809,15 +700,15 @@ Heaps that support change_priority operation use it. Heaps that do not support i
809
700
  <td>1</td>
810
701
  </tr>
811
702
  <tr>
812
- <td>Fibonacci</td>
813
- <td>1.256x slower</td>
703
+ <td>lazy_priority_queue</td>
704
+ <td>2.55x slower</td>
814
705
  </tr>
815
706
  <tr>
816
- <td>lazy_priority_queue</td>
817
- <td>1.648x slower</td>
707
+ <td>Fibonacci</td>
708
+ <td>2.74x slower</td>
818
709
  </tr>
819
710
  <tr>
820
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
711
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
821
712
  </tr>
822
713
  <tr>
823
714
  <th>Library</th>
@@ -829,14 +720,14 @@ Heaps that support change_priority operation use it. Heaps that do not support i
829
720
  </tr>
830
721
  <tr>
831
722
  <td>Fibonacci</td>
832
- <td>1.327x slower</td>
723
+ <td>1.267x slower</td>
833
724
  </tr>
834
725
  <tr>
835
726
  <td>lazy_priority_queue</td>
836
- <td>1.383x slower</td>
727
+ <td>1.396x slower</td>
837
728
  </tr>
838
729
  <tr>
839
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
730
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
840
731
  </tr>
841
732
  <tr>
842
733
  <th>Library</th>
@@ -848,18 +739,18 @@ Heaps that support change_priority operation use it. Heaps that do not support i
848
739
  </tr>
849
740
  <tr>
850
741
  <td>lazy_priority_queue</td>
851
- <td>3.878x slower</td>
742
+ <td>3.54x slower</td>
852
743
  </tr>
853
744
  <tr>
854
745
  <td>Fibonacci</td>
855
- <td>9.889x slower</td>
746
+ <td>5.86x slower</td>
856
747
  </tr>
857
748
  </table>
858
749
 
859
750
  #### Change priority not required
860
751
  <table>
861
752
  <tr>
862
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin21]</th>
753
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin23]</th>
863
754
  </tr>
864
755
  <tr>
865
756
  <th>Library</th>
@@ -871,22 +762,22 @@ Heaps that support change_priority operation use it. Heaps that do not support i
871
762
  </tr>
872
763
  <tr>
873
764
  <td>pairing_heap (PairingHeap)</td>
874
- <td>1.318x slower</td>
765
+ <td>1.29x slower</td>
875
766
  </tr>
876
767
  <tr>
877
768
  <td>rb_heap</td>
878
- <td>1.8x slower</td>
769
+ <td>1.53x slower</td>
879
770
  </tr>
880
771
  <tr>
881
772
  <td>lazy_priority_queue</td>
882
- <td>2.519x slower</td>
773
+ <td>2.6x slower</td>
883
774
  </tr>
884
775
  <tr>
885
776
  <td>Fibonacci</td>
886
- <td>2.989x slower</td>
777
+ <td>4.29x slower</td>
887
778
  </tr>
888
779
  <tr>
889
- <th colspan="4">ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) +YJIT [x86_64-darwin21]</th>
780
+ <th colspan="4">ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [x86_64-darwin23]</th>
890
781
  </tr>
891
782
  <tr>
892
783
  <th>Library</th>
@@ -896,24 +787,24 @@ Heaps that support change_priority operation use it. Heaps that do not support i
896
787
  <td>pairing_heap (SimplePairingHeap)</td>
897
788
  <td>1</td>
898
789
  </tr>
899
- <tr>
900
- <td>pairing_heap (PairingHeap)</td>
901
- <td>1.348x slower</td>
902
- </tr>
903
790
  <tr>
904
791
  <td>rb_heap</td>
905
- <td>1.490x slower</td>
792
+ <td>1.227x slower</td>
906
793
  </tr>
907
794
  <tr>
908
- <td>Fibonacci</td>
909
- <td>1.792x slower</td>
795
+ <td>pairing_heap (PairingHeap)</td>
796
+ <td>1.316x slower</td>
910
797
  </tr>
911
798
  <tr>
912
799
  <td>lazy_priority_queue</td>
913
- <td>2.492x slower</td>
800
+ <td>3.094x slower</td>
801
+ </tr>
802
+ <tr>
803
+ <td>Fibonacci</td>
804
+ <td>3.79x slower</td>
914
805
  </tr>
915
806
  <tr>
916
- <th colspan="4">jruby 9.3.7.0 (2.6.8) 2022-08-16 c79ef237e0 OpenJDK 64-Bit Server VM 17.0.2+8-86 on 17.0.2+8-86 +indy +jit [x86_64-darwin]</th>
807
+ <th colspan="4">jruby 9.4.5.0 (3.1.4) 2023-11-02 1abae2700f OpenJDK 64-Bit Server VM 21+35-2513 on 21+35-2513 +indy +jit [x86_64-darwin]</th>
917
808
  </tr>
918
809
  <tr>
919
810
  <th>Library</th>
@@ -921,26 +812,26 @@ Heaps that support change_priority operation use it. Heaps that do not support i
921
812
  </tr>
922
813
  <tr>
923
814
  <td>pairing_heap (SimplePairingHeap)</td>
924
- <td>1</td>
815
+ <td>1.033x slower</td>
925
816
  </tr>
926
817
  <tr>
927
818
  <td>rb_heap</td>
928
- <td>1.292x slower</td>
819
+ <td>1.133x slower</td>
929
820
  </tr>
930
821
  <tr>
931
822
  <td>pairing_heap (PairingHeap)</td>
932
- <td>1.359x slower</td>
823
+ <td>1.302x slower</td>
933
824
  </tr>
934
825
  <tr>
935
826
  <td>Fibonacci</td>
936
- <td>1.824x slower</td>
827
+ <td>1.602x slower</td>
937
828
  </tr>
938
829
  <tr>
939
830
  <td>lazy_priority_queue</td>
940
- <td>2.115x slower</td>
831
+ <td>1.777x slower</td>
941
832
  </tr>
942
833
  <tr>
943
- <th colspan="4">truffleruby 22.2.0, like ruby 3.0.3, GraalVM CE JVM [x86_64-darwin]</th>
834
+ <th colspan="4">truffleruby 23.1.2, like ruby 3.2.2, Oracle GraalVM JVM [x86_64-darwin]</th>
944
835
  </tr>
945
836
  <tr>
946
837
  <th>Library</th>
@@ -951,20 +842,20 @@ Heaps that support change_priority operation use it. Heaps that do not support i
951
842
  <td>1</td>
952
843
  </tr>
953
844
  <tr>
954
- <td>pairing_heap (PairingHeap)</td>
955
- <td>1.865x slower</td>
845
+ <td>rb_heap</td>
846
+ <td>1.35x slower</td>
956
847
  </tr>
957
848
  <tr>
958
- <td>rb_heap</td>
959
- <td>1.915x slower</td>
849
+ <td>pairing_heap (PairingHeap)</td>
850
+ <td>1.58x slower</td>
960
851
  </tr>
961
852
  <tr>
962
853
  <td>lazy_priority_queue</td>
963
- <td>8.791x slower</td>
854
+ <td>5.46x slower</td>
964
855
  </tr>
965
856
  <tr>
966
857
  <td>Fibonacci</td>
967
- <td>26.044x slower</td>
858
+ <td>7.54x slower</td>
968
859
  </tr>
969
860
  </table>
970
861