
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