Improvement of Dual-Pivot Quicksort (Radix sort)

Vladimir Yaroslavskiy vlv.spb.ru at mail.ru
Sat May 8 21:21:15 UTC 2021


Hi,
 
I’d like to share new improvement of Dual-Pivot Quicksort: new algorithm of sorting, Radix sort,
is suggested. Also performance was improved in case of corner merging of runs. The changes are:
 
Sorting:
- adopt radix sort for sequential and parallel sorts on int/long/float/double arrays (almost random and length > 6K)
- fix tryMergeRuns() to better handle case when the last run is a single element
- minor javadoc and comment changes
Testing:
- add new data inputs in tests for sorting
- add min/max/infinity values to float/double testing
- add tests for radix sort
 
See related JDB and PR
https://bugs.openjdk.java.net/browse/JDK-8266431
https://github.com/openjdk/jdk/pull/3938
 
Laurent Bourges has tested new version of Dual-Pivot Quicksort, it shows better performance.
 
--- STATS ---
Comparing sorters SYSTEM vs NEW_DPQS_REF
winners : 75 / 197
avg (%): 125.5317
stats (%): [360: µ=146.05562 σ=106.212036 rms=252.26765 min=29.021154 max=618.46735]
Stats per keys:
IDENT_____:SPIRAL stats (%): [12: µ=146.85367 σ=67.929474 rms=214.78313 min=81.47126 max=301.9469]
IDENT_____:STAGGER stats (%): [12: µ=124.82189 σ=85.498825 rms=210.32072 min=81.963005 max=395.48715]
IDENT_____:SAWTOTH stats (%): [12: µ=121.015236 σ=48.471672 rms=169.48691 min=92.21825 max=227.12547]
IDENT_____:_RANDOM stats (%): [12: µ=235.53735 σ=204.9386 rms=440.47595 min=84.627625 max=613.981]
IDENT_____:PLATEAU stats (%): [12: µ=99.05677 σ=1.7938316 rms=100.85061 min=95.937035 max=100.65806]
IDENT_____:SHUFFLE stats (%): [12: µ=91.41511 σ=19.296474 rms=110.71158 min=57.53845 max=117.839775]
REVERSE___:SPIRAL stats (%): [12: µ=214.24744 σ=86.17577 rms=300.42322 min=90.77709 max=355.51056]
REVERSE___:STAGGER stats (%): [12: µ=127.6578 σ=87.32062 rms=214.97841 min=94.24164 max=404.43817]
REVERSE___:SAWTOTH stats (%): [12: µ=121.37123 σ=39.691704 rms=161.06294 min=95.34109 max=209.51929]
REVERSE___:_RANDOM stats (%): [12: µ=251.44595 σ=221.17654 rms=472.6225 min=86.738144 max=618.46735]
REVERSE___:PLATEAU stats (%): [12: µ=104.74188 σ=6.7017303 rms=111.44361 min=97.345634 max=120.3795]
REVERSE___:SHUFFLE stats (%): [12: µ=100.18308 σ=19.42561 rms=119.608696 min=69.78542 max=135.48901]
DITHER____:SPIRAL stats (%): [12: µ=183.42812 σ=64.67034 rms=248.09845 min=99.713776 max=268.3382]
DITHER____:STAGGER stats (%): [12: µ=174.41586 σ=123.18825 rms=297.60413 min=99.123314 max=459.56564]
DITHER____:SAWTOTH stats (%): [12: µ=187.5975 σ=110.62237 rms=298.21988 min=97.2715 max=367.14056]
DITHER____:_RANDOM stats (%): [12: µ=185.65709 σ=129.0605 rms=314.7176 min=70.168724 max=434.8079]
DITHER____:PLATEAU stats (%): [12: µ=100.72014 σ=3.9355173 rms=104.655655 min=94.559074 max=107.78911]
DITHER____:SHUFFLE stats (%): [12: µ=86.45017 σ=42.46921 rms=128.91939 min=29.021154 max=171.31981]
REVERSE_BA:SPIRAL stats (%): [12: µ=177.85292 σ=85.1786 rms=263.03152 min=94.477264 max=315.87576]
REVERSE_BA:STAGGER stats (%): [12: µ=132.4794 σ=103.280464 rms=235.75987 min=97.76542 max=460.07227]
REVERSE_BA:SAWTOTH stats (%): [12: µ=110.42876 σ=23.894398 rms=134.32315 min=98.04496 max=182.87247]
REVERSE_BA:_RANDOM stats (%): [12: µ=223.70018 σ=185.21355 rms=408.91373 min=86.62554 max=618.0156]
REVERSE_BA:PLATEAU stats (%): [12: µ=99.096275 σ=1.8192571 rms=100.91553 min=95.90717 max=100.805466]
REVERSE_BA:SHUFFLE stats (%): [12: µ=101.3669 σ=22.24021 rms=123.60711 min=65.73001 max=144.21266]
REVERSE_FR:SPIRAL stats (%): [12: µ=190.94035 σ=74.251236 rms=265.1916 min=97.7578 max=358.39563]
REVERSE_FR:STAGGER stats (%): [12: µ=134.06009 σ=104.719696 rms=238.77979 min=98.797386 max=466.2626]
REVERSE_FR:SAWTOTH stats (%): [12: µ=110.6682 σ=27.3231 rms=137.9913 min=94.27639 max=195.0114]
REVERSE_FR:_RANDOM stats (%): [12: µ=248.0682 σ=201.4303 rms=449.4985 min=97.789764 max=614.1303]
REVERSE_FR:PLATEAU stats (%): [12: µ=99.416336 σ=7.2677627 rms=106.6841 min=87.80682 max=115.78382]
REVERSE_FR:SHUFFLE stats (%): [12: µ=96.97448 σ=18.399363 rms=115.37385 min=64.20668 max=130.8938]
 
https://github.com/bourgesl/nearly-optimal-mergesort-code/tree/master/sort-bench/results/2021/2105-final
 
Radix Sort benchmark
https://github.com/bourgesl/radix-sort-benchmark/blob/main/results/2021-ref/cmp-16-1M-global-final-2.log
 
Thank you,
Vladimir


More information about the core-libs-dev mailing list