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
