Skip to content

Performance regression due to lack of inlining of `foldl` and `foldl'`.

For some reason Data.List.sum is much slower than the naive recursive definition for it. Does not seem happen in 7.8.

  import Data.List
  import Criterion.Main
 
  sum1 [] = 0
  sum1 (x:xs) = x + sum1 xs
 
  sum2 = foldr (+) 0
  sum3 = foldl' (+) 0
  sum4 = getSum #. foldMap Sum
 
 
  main = do
      let els = [1..100000]
      defaultMain [
       bench "sum0" $ whnf  (sum :: [Int] -> Int) els
       ,bench "sum" $ whnf  (sum :: [Int] -> Int) els
       ,bench "sum1" $ whnf (sum1:: [Int] -> Int) els
       ,bench "sum2" $ whnf (sum2:: [Int] -> Int) els
       ,bench "sum3" $ whnf (sum3:: [Int] -> Int) els
       ,bench "sum4" $ whnf (sum4:: [Int] -> Int) els
       ]
 
{-
 
benchmarking sum0
time                 128.0 ms   (121.7 ms .. 133.8 ms)
                     0.997 R²   (0.994 R² .. 1.000 R²)
mean                 132.8 ms   (130.1 ms .. 136.3 ms)
std dev              4.622 ms   (2.980 ms .. 6.577 ms)
variance introduced by outliers: 11% (moderately inflated)
 
benchmarking sum
time                 131.0 ms   (125.7 ms .. 136.7 ms)
                     0.998 R²   (0.993 R² .. 1.000 R²)
mean                 131.9 ms   (128.6 ms .. 136.7 ms)
std dev              5.971 ms   (2.903 ms .. 9.649 ms)
variance introduced by outliers: 11% (moderately inflated)
 
benchmarking sum1
time                 26.29 ms   (25.43 ms .. 27.24 ms)
                     0.995 R²   (0.991 R² .. 0.998 R²)
mean                 26.30 ms   (25.73 ms .. 26.98 ms)
std dev              1.293 ms   (953.2 μs .. 1.804 ms)
variance introduced by outliers: 15% (moderately inflated)
 
benchmarking sum2
time                 26.39 ms   (25.49 ms .. 27.26 ms)
                     0.995 R²   (0.991 R² .. 0.998 R²)
mean                 26.33 ms   (25.77 ms .. 26.95 ms)
std dev              1.295 ms   (941.5 μs .. 1.878 ms)
variance introduced by outliers: 15% (moderately inflated)
 
benchmarking sum3
time                 7.695 ms   (7.670 ms .. 7.722 ms)
                     1.000 R²   (1.000 R² .. 1.000 R²)
mean                 7.703 ms   (7.691 ms .. 7.733 ms)
std dev              51.21 μs   (25.43 μs .. 99.41 μs)
 
benchmarking sum4
time                 26.29 ms   (25.40 ms .. 27.21 ms)
                     0.995 R²   (0.989 R² .. 0.998 R²)
mean                 26.36 ms   (25.88 ms .. 27.08 ms)
std dev              1.364 ms   (954.5 μs .. 1.899 ms)
variance introduced by outliers: 20% (moderately inflated)
  
  -}
Trac metadata
Trac field Value
Version 7.10.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
Edited by Joachim Breitner
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information