Does
reverse . sort
or
sortBy
run faster when attempting to sort a list of integers in descending order?
I whipped up a Criterion test sorting using (reverse . sort)
, and (sortBy (comparing Down))
. Lists to sort were ordered and reverse ordered (should be worst and best cases, not necessarily in that order).
import Criterion
import Criterion.Main
import Data.List
import Data.Ord
main :: IO ()
main = defaultMain [ bench "Sort, forward" (whnf (reverse . sort) ([1..10000] :: [Int]))
, bench "Sort, backward" (whnf (reverse . sort) ([10000,9999..1] :: [Int]))
, bench "sortby, forward" (whnf (sortBy (comparing Down)) ([1..10000] :: [Int]))
, bench "sortby, backward" (whnf (sortBy (comparing Down)) ([10000,9999..1] :: [Int]))
]
{-
warming up
estimating clock resolution...
mean is 2.290904 us (320001 iterations)
found 79468 outliers among 319999 samples (24.8%)
734 (0.2%) low severe
78734 (24.6%) high severe
estimating cost of a clock call...
mean is 512.8809 ns (23 iterations)
found 4 outliers among 23 samples (17.4%)
2 (8.7%) high mild
2 (8.7%) high severe
benchmarking Sort, forward
mean: 551.4973 us, lb 549.7330 us, ub 553.6538 us, ci 0.950
std dev: 9.998922 us, lb 8.400519 us, ub 12.37726 us, ci 0.950
found 4 outliers among 100 samples (4.0%)
4 (4.0%) high mild
variance introduced by outliers: 11.316%
variance is moderately inflated by outliers
benchmarking Sort, backward
mean: 307.6627 us, lb 306.6471 us, ub 308.9350 us, ci 0.950
std dev: 5.790552 us, lb 4.777178 us, ub 7.103792 us, ci 0.950
found 9 outliers among 100 samples (9.0%)
7 (7.0%) high mild
2 (2.0%) high severe
variance introduced by outliers: 11.365%
variance is moderately inflated by outliers
benchmarking sortby, forward
mean: 168.2486 us, lb 167.7343 us, ub 168.8683 us, ci 0.950
std dev: 2.880548 us, lb 2.448853 us, ub 3.394461 us, ci 0.950
found 4 outliers among 100 samples (4.0%)
4 (4.0%) high mild
variance introduced by outliers: 9.467%
variance is slightly inflated by outliers
benchmarking sortby, backward
mean: 262.6001 us, lb 261.3540 us, ub 264.1395 us, ci 0.950
std dev: 7.096662 us, lb 6.053786 us, ub 8.634885 us, ci 0.950
found 3 outliers among 100 samples (3.0%)
3 (3.0%) high mild
variance introduced by outliers: 20.965%
variance is moderately inflated by outliers
-}
Reversing lists is expensive. The best case test with reverse
was still significantly (statistically) slower than the worst case with sortBy
.
Mean runtimes were:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With