[Haskell-cafe] Re: Performance question

Benedikt Huber benjovi at gmx.net
Thu Feb 26 05:42:44 EST 2009


haskell at kudling.de schrieb:
> Hi,
> 
> i have compared a C++ implementation with a Haskell implementation of the Monte Carlo Pi approximation:
> 
> http://lennart.kudling.de/haskellPi/
> 
> The Haskell version is 100 times slower and i wonder whether i do something obvious wrong.
>
Hi,
Nice benchmark, but I think the culprit is the random number generator.
For simplicity, here is a 1-1 translation of the C++ code:

 > main =
 >    do args <- getArgs
 >       let samples = read $ head args
 >       randomNumbers <- genRandoms
 >       print (monteCarlo samples randomNumbers)
 > genRandoms :: IO [Double]
 > genRandoms = liftM randoms getStdGen
 > monteCarlo :: Int -> [Double] -> Double
 > monteCarlo samples = go 0 samples where
 >     go cnt 0 _ = (4.0 :: Double) * (fromIntegral cnt) /
 >                  (fromIntegral > samples)
 >     go cnt k (x:y:rs) | sqrt (x*x + y*y) <= 1.0 = go (cnt+1) (k-1) rs
 >                       | otherwise               = go cnt     (k-1) rs

The profiling shows that most time is spend in genRandoms:

genRandoms Main 199 1  96.5   98.3    96.5   98.3

When replacing genRandoms by (repeat 0.5), the haskell code is only a 
little bit slower than the C++ code *with* random number generation.

Of course, the random number generation in C++ takes time too:

 > montecarlo(0) $ pprof --text ./monte_carlo /tmp/profile
 > Total: 6691 samples
 >    3928  58.7%  58.7%     5965  89.1% _main
 >    2134  31.9%  90.6%     2134  31.9% _do_rand
 >     435   6.5%  97.1%      435   6.5% _rand
 >     194   2.9% 100.0%      194   2.9% 0x00003072
 >       0   0.0% 100.0%     6691 100.0% __mh_execute_header
 >       0   0.0% 100.0%     6691 100.0% start

But the factor 100 is clearly due to genRandoms.

cheers, benedikt

> Profiling says that the majority of the time is spend in "main". But i have no idea where.
> 
> Can someone give me a hint?
> 
> Thanks,
> Lenny
> 
>                                                                individual    inherited
> COST CENTRE              MODULE                                               no.    entries  %time %alloc   %time %alloc
> 
> MAIN                     MAIN                                                   1           0   0.0    0.0   100.0  100.0
>  main                    Main                                                 254           1  88.1   90.8   100.0  100.0
>   monteCarloPi           Main                                                 255           1   0.6    1.1    11.9    9.2
>    pairs                 Main                                                 257    10000000   0.7    1.4     0.7    1.4
>    countHits             Main                                                 256    10000001   4.2    2.9    10.6    6.7
>     accumulateHit        Main                                                 258    27852236   3.0    2.3     6.4    3.8
>      isInCircle          Main                                                 259    30000000   3.3    1.5     3.3    1.5
>  CAF:lit_r1A7            Main                                                 248           1   0.0    0.0     0.0    0.0
>   isInCircle             Main                                                 260           0   0.0    0.0     0.0    0.0



More information about the Haskell-Cafe mailing list