Commit 51b8c66
authored
[libc++] Extend the scope of radix sorting inside std::stable_sort to floating-point types (llvm#129452)
These changes speed up `std::stable_sort` in the case of sorting
floating-point types.
This applies only to IEEE 754 floats.
The speedup is similar to that achieved for integers in PR llvm#104683 (see
benchmarks below).
Why does this worth doing?
Previously, `std::stable_sort` had almost no chance of beating
`std::sort`.
Now there are cases when `std::stable_sort` is preferrable, and the
difference is significant.
```
---------------------------------------------------------------------------
Benchmark | std::stable_sort | std::sort | std::stable_sort
| without radix_sort | | with radix_sort
---------------------------------------------------------------------------
float_Random_1 | 1.62 ns | 2.15 ns | 1.61 ns
float_Random_4 | 18.0 ns | 2.71 ns | 16.3 ns
float_Random_16 | 118 ns | 113 ns | 112 ns
float_Random_64 | 751 ns | 647 ns | 730 ns
float_Random_256 | 4715 ns | 2937 ns | 4669 ns
float_Random_1024 | 25713 ns | 13172 ns | 5959 ns <--
float_Random_4096 | 131307 ns | 56870 ns | 19294 ns <--
float_Random_16384 | 624996 ns | 242953 ns | 64264 ns <--
float_Random_65536 | 2895661 ns | 1027279 ns | 288553 ns <--
float_Random_262144 | 13285372 ns | 4342593 ns | 3022377 ns <--
float_Random_1048576 | 60595871 ns | 19087591 ns | 18690457 ns <--
float_Random_2097152 | 131336117 ns | 38800396 ns | 52325016 ns
float_Random_4194304 | 270043042 ns | 79978019 ns | 102907726 ns
double_Random_1 | 1.60 ns | 2.15 ns | 1.61 ns
double_Random_4 | 15.2 ns | 2.70 ns | 16.9 ns
double_Random_16 | 104 ns | 112 ns | 119 ns
double_Random_64 | 712 ns | 614 ns | 755 ns
double_Random_256 | 4496 ns | 2966 ns | 4820 ns
double_Random_1024 | 24722 ns | 12679 ns | 6189 ns <--
double_Random_4096 | 126075 ns | 54484 ns | 20999 ns <--
double_Random_16384 | 613782 ns | 232557 ns | 110276 ns <--
double_Random_65536 | 2894972 ns | 988531 ns | 774302 ns <--
double_Random_262144 | 13460273 ns | 4278059 ns | 5115123 ns
double_Random_1048576 | 61119996 ns | 18408462 ns | 27166574 ns
double_Random_2097152 | 132511525 ns | 37986158 ns | 54423869 ns
double_Random_4194304 | 272949862 ns | 77912616 ns | 147670834 ns
```
Comparison for only `std::stable_sort`:
```
Benchmark Time Time Old Time New
--------------------------------------------------------------------------------------------------
BM_StableSort_float_Random_1024 -0.7997 25438 5096
BM_StableSort_float_Random_4096 -0.8731 128157 16260
BM_StableSort_float_Random_16384 -0.9024 621271 60623
BM_StableSort_float_Random_65536 -0.9081 2922413 268619
BM_StableSort_float_Random_262144 -0.7766 13386345 2990408
BM_StableSort_float_Random_1048576 -0.6954 60673010 18481751
BM_StableSort_float_Random_2097152 -0.6026 130977358 52052182
BM_StableSort_float_Random_4194304 -0.6252 271556583 101770500
BM_StableSort_float_Ascending_1024 -0.6430 6711 2396
BM_StableSort_float_Ascending_4096 -0.7979 38460 7773
BM_StableSort_float_Ascending_16384 -0.8471 191069 29222
BM_StableSort_float_Ascending_65536 -0.8683 882321 116194
BM_StableSort_float_Ascending_262144 -0.8346 3868552 639937
BM_StableSort_float_Ascending_1048576 -0.7460 16521233 4195953
BM_StableSort_float_Ascending_2097152 -0.5439 21757532 9922776
BM_StableSort_float_Ascending_4194304 -0.7525 67847496 16791582
BM_StableSort_float_Descending_1024 -0.6359 15038 5475
BM_StableSort_float_Descending_4096 -0.7090 62810 18278
BM_StableSort_float_Descending_16384 -0.7763 311844 69750
BM_StableSort_float_Descending_65536 -0.7228 1270513 352202
BM_StableSort_float_Descending_262144 -0.6785 5484173 1763045
BM_StableSort_float_Descending_1048576 -0.5084 20223149 9941852
BM_StableSort_float_Descending_2097152 -0.7646 60523254 14247014
BM_StableSort_float_Descending_4194304 -0.5638 95706839 41748858
BM_StableSort_float_SingleElement_1024 +0.3715 1732 2375
BM_StableSort_float_SingleElement_4096 -0.1685 9357 7781
BM_StableSort_float_SingleElement_16384 -0.3793 47307 29362
BM_StableSort_float_SingleElement_65536 -0.4925 227666 115536
BM_StableSort_float_SingleElement_262144 -0.4271 1075853 616387
BM_StableSort_float_SingleElement_1048576 -0.3736 5097599 3193279
BM_StableSort_float_SingleElement_2097152 -0.2470 9854161 7420158
BM_StableSort_float_SingleElement_4194304 -0.3384 22175964 14670720
BM_StableSort_float_PipeOrgan_1024 -0.4885 10664 5455
BM_StableSort_float_PipeOrgan_4096 -0.6340 50095 18337
BM_StableSort_float_PipeOrgan_16384 -0.7078 238700 69739
BM_StableSort_float_PipeOrgan_65536 -0.6740 1102419 359378
BM_StableSort_float_PipeOrgan_262144 -0.7460 4698739 1193511
BM_StableSort_float_PipeOrgan_1048576 -0.5657 18493972 8032392
BM_StableSort_float_PipeOrgan_2097152 -0.7116 41089206 11850349
BM_StableSort_float_PipeOrgan_4194304 -0.6650 83445011 27955737
BM_StableSort_float_QuickSortAdversary_1024 -0.6863 17402 5460
BM_StableSort_float_QuickSortAdversary_4096 -0.7715 79864 18247
BM_StableSort_float_QuickSortAdversary_16384 -0.7800 317480 69839
BM_StableSort_float_QuickSortAdversary_65536 -0.7400 1357601 352967
BM_StableSort_float_QuickSortAdversary_262144 -0.6450 5662094 2009769
BM_StableSort_float_QuickSortAdversary_1048576 -0.5092 21173627 10392107
BM_StableSort_float_QuickSortAdversary_2097152 -0.7333 61748178 16469993
BM_StableSort_float_QuickSortAdversary_4194304 -0.5607 98459863 43250182
BM_StableSort_double_Random_1024 -0.7657 24769 5802
BM_StableSort_double_Random_4096 -0.8441 126449 19717
BM_StableSort_double_Random_16384 -0.8269 614910 106447
BM_StableSort_double_Random_65536 -0.7413 2905000 751427
BM_StableSort_double_Random_262144 -0.6287 13449514 4994348
BM_StableSort_double_Random_1048576 -0.5635 60863246 26568349
BM_StableSort_double_Random_2097152 -0.5959 130293892 52654532
BM_StableSort_double_Random_4194304 -0.4772 272616445 142526267
BM_StableSort_double_Ascending_1024 -0.4870 6757 3466
BM_StableSort_double_Ascending_4096 -0.7360 37592 9923
BM_StableSort_double_Ascending_16384 -0.7971 183967 37324
BM_StableSort_double_Ascending_65536 -0.7465 897116 227398
BM_StableSort_double_Ascending_262144 -0.6764 4020980 1301033
BM_StableSort_double_Ascending_1048576 -0.6407 16421799 5900751
BM_StableSort_double_Ascending_2097152 -0.6380 29347139 10622419
BM_StableSort_double_Ascending_4194304 -0.5934 70439925 28644185
BM_StableSort_double_Descending_1024 -0.5988 15216 6105
BM_StableSort_double_Descending_4096 -0.6857 65069 20449
BM_StableSort_double_Descending_16384 -0.6922 329321 101381
BM_StableSort_double_Descending_65536 -0.7038 1367970 405242
BM_StableSort_double_Descending_262144 -0.6472 5361644 1891429
BM_StableSort_double_Descending_1048576 -0.6656 22031404 7366459
BM_StableSort_double_Descending_2097152 -0.7593 68922467 16591242
BM_StableSort_double_Descending_4194304 -0.6392 96283643 34743223
BM_StableSort_double_SingleElement_1024 +0.9128 1895 3625
BM_StableSort_double_SingleElement_4096 +0.1475 10013 11490
BM_StableSort_double_SingleElement_16384 -0.1901 52382 42424
BM_StableSort_double_SingleElement_65536 -0.2096 254698 201313
BM_StableSort_double_SingleElement_262144 -0.1833 1248478 1019648
BM_StableSort_double_SingleElement_1048576 -0.1741 5703397 4710603
BM_StableSort_double_SingleElement_2097152 -0.1751 10922197 9009835
BM_StableSort_double_SingleElement_4194304 -0.1538 26571923 22485137
BM_StableSort_double_PipeOrgan_1024 -0.4406 10752 6014
BM_StableSort_double_PipeOrgan_4096 -0.5917 49456 20195
BM_StableSort_double_PipeOrgan_16384 -0.6258 270515 101221
BM_StableSort_double_PipeOrgan_65536 -0.7098 1159462 336457
BM_StableSort_double_PipeOrgan_262144 -0.6591 4735711 1614433
BM_StableSort_double_PipeOrgan_1048576 -0.6620 19353110 6541172
BM_StableSort_double_PipeOrgan_2097152 -0.7288 49131812 13323391
BM_StableSort_double_PipeOrgan_4194304 -0.5988 81958974 32878171
BM_StableSort_double_QuickSortAdversary_1024 -0.6516 17948 6254
BM_StableSort_double_QuickSortAdversary_4096 -0.7527 82359 20363
BM_StableSort_double_QuickSortAdversary_16384 -0.7009 340410 101811
BM_StableSort_double_QuickSortAdversary_65536 -0.6854 1487480 467928
BM_StableSort_double_QuickSortAdversary_262144 -0.6386 5648460 2041377
BM_StableSort_double_QuickSortAdversary_1048576 -0.6127 22859142 8852587
BM_StableSort_double_QuickSortAdversary_2097152 -0.7161 68693975 19499381
BM_StableSort_double_QuickSortAdversary_4194304 -0.5909 95532179 39077491
OVERALL_GEOMEAN -0.6472 0 0
```1 parent 70d34e4 commit 51b8c66
File tree
4 files changed
+166
-11
lines changed- libcxx
- docs/ReleaseNotes
- include/__algorithm
- test/std/algorithms/alg.sorting/alg.sort/stable.sort
4 files changed
+166
-11
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
64 | 64 | | |
65 | 65 | | |
66 | 66 | | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
67 | 70 | | |
68 | 71 | | |
69 | 72 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | | - | |
34 | 34 | | |
| 35 | + | |
35 | 36 | | |
36 | 37 | | |
37 | 38 | | |
| |||
44 | 45 | | |
45 | 46 | | |
46 | 47 | | |
| 48 | + | |
47 | 49 | | |
48 | 50 | | |
49 | 51 | | |
| 52 | + | |
| 53 | + | |
50 | 54 | | |
51 | 55 | | |
52 | 56 | | |
| |||
298 | 302 | | |
299 | 303 | | |
300 | 304 | | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
301 | 395 | | |
302 | 396 | | |
303 | 397 | | |
| |||
314 | 408 | | |
315 | 409 | | |
316 | 410 | | |
317 | | - | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
318 | 414 | | |
319 | 415 | | |
320 | 416 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
30 | 29 | | |
31 | 30 | | |
32 | 31 | | |
| |||
201 | 200 | | |
202 | 201 | | |
203 | 202 | | |
204 | | - | |
| 203 | + | |
205 | 204 | | |
206 | 205 | | |
207 | 206 | | |
| |||
211 | 210 | | |
212 | 211 | | |
213 | 212 | | |
214 | | - | |
| 213 | + | |
215 | 214 | | |
216 | 215 | | |
217 | 216 | | |
| |||
245 | 244 | | |
246 | 245 | | |
247 | 246 | | |
248 | | - | |
249 | | - | |
250 | | - | |
251 | | - | |
252 | | - | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
253 | 252 | | |
254 | 253 | | |
255 | 254 | | |
| |||
Lines changed: 58 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
21 | 22 | | |
| 23 | + | |
22 | 24 | | |
23 | 25 | | |
24 | 26 | | |
| |||
68 | 70 | | |
69 | 71 | | |
70 | 72 | | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
71 | 80 | | |
72 | 81 | | |
73 | 82 | | |
| |||
193 | 202 | | |
194 | 203 | | |
195 | 204 | | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
196 | 249 | | |
197 | 250 | | |
198 | | - | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
199 | 255 | | |
200 | 256 | | |
201 | 257 | | |
| 258 | + | |
202 | 259 | | |
203 | 260 | | |
204 | 261 | | |
| |||
0 commit comments