Hello everyone.
I wonder why using do notation with `<-` can ruin the performance.
In essence the problem is that, for some action `f :: m Double`,
running the code (in my case, `standard` from mwc-random).
f
for million times is fast but the code
do
v <- f
return v
is slower about a hundred times.
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 -----
I don't quite understand why this happens. I'm using GHC 7.4.1 on Linux x86_64
system.
Compiling *both* versions with profiling enabled changes runtime to 5.673 sec,
which is exactly half the runtime of slow version without profiling, and this
is awkward
(double calculations occuring in do block?).
Does anybody have an idea if this is a problem with my do, or with mwc-random,
or with vector
(my notation disallowing efficient unboxing?).
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe