
Well, it's not "do" notation, since replacing "standard g" with "standard g >>= return" gives the same poor performance. I wonder if it has something to do with error checking. On 11 Jun 2012, at 13:38, Dmitry Dzhus wrote:
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 Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe