[Haskell-cafe] forLoop + strict State monad is much faster than foldl'
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
(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.
More information about the Haskell-Cafe