[Haskell-cafe] forLoop + strict State monad is much faster than foldl'
Niklas Hambüchen
mail at nh2.me
Tue Apr 29 16:31:51 UTC 2014
This is just a short notice that using
foldl' (+) 0 [0..100000::Int]
is over 10 times slower than using
flip execState 0 $
forLoop (0 :: Int) (< n) (+1) $ \i -> do
x <- get
put $! x + i
with `loopFor` as on https://github.com/nh2/loop.
Even using an IORef is twice as fast as the pure foldl' (but still 5
times slower than strict State).
The benchmark is at
http://htmlpreview.github.io/?https://github.com/nh2/loop/blob/master/results/bench-foldl-and-iorefs-are-slow.html.
(All benchmarks are linked from https://github.com/nh2/loop.)
You can see there that the problem is gone when using Vector.foldl', but
only for Int - for Word32 it persists.
It seems that manual looping is beneficial even when dealing with prime
examples of pure code that GHC ought to optimize well.
Niklas
More information about the Haskell-Cafe
mailing list