[Haskell-cafe] forLoop + strict State monad is much faster than foldl'
patrick.john.wheeler at gmail.com
Thu May 1 14:17:38 UTC 2014
You can use the `foldM` form the FoldL package to achieve equal results as
the fastest loops in your current benchmark. foldM will allow you to deal
with your loops at a high level of abstraction though. See the following
post, by Gabriel Gonzalez, for an example:
I have added the bench mark to my fork of your repo, and made a pull
It looks like the only reason that `foldM` does not preform well with
`Word32` is because of the naive implementation of `enumFromTo` for Word32
as explained in my other email in more detail.
Here is the Criterion report:
On Tue, Apr 29, 2014 at 11:31 AM, Niklas Hambüchen <mail at nh2.me> wrote:
> 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.
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
Patrick.John.Wheeler at gmail.com
Patrick.J.Wheeler at rice.edu
Patrick.Wheeler at colorado.edu
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Haskell-Cafe