On 11/06/2012, at 10:38, Dmitry Dzhus wrote:

> Consider this simple source where we generate an unboxed vector with million
> pseudo-random numbers:
> 
> ---- 8< -----
> import qualified Data.Vector.Unboxed as VU
> 
> import System.Random.MWC
> import System.Random.MWC.Distributions (standard)
> 
> count = 1000000
> 
> main = do
>  g <- create
>  e' <- VU.replicateM count $ standard g
>  return ()
> ---- >8 -----
> 
> Being compiled with -O2, this runs for 0.052 s on my machine.
> 
> Changing the replicateM line to use do notation brings the runtime down to 
> 11.257 s!
> See below:
> 
> ---- 8< -----
> import qualified Data.Vector.Unboxed as VU
> 
> import System.Random.MWC
> import System.Random.MWC.Distributions (standard)
> 
> count = 1000000
> 
> main = do
>  g <- create
>  e' <- VU.replicateM count $ do
>           v <- standard g
>           return v
>  return ()
> ---- >8 -----

The former essentially generates this:

  replicateM n ((letrec f = ... in f) `cast` ...)

and the latter this:

  replicateM n (\(s :: State# RealWorld) -> (letrec f = ... in f s) `cast` ...)

I'd look further into this but mwc-random just inlines too much stuff. Could 
you perhaps find a smaller example that doesn't use mwc-random? In any case, it 
looks like a GHC bug, perhaps the state hack is getting in the way.

Roman



_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to