<div dir="ltr">few more points: <div><br></div><div>- In function f2/f3 I use a local function ``go'' instead of loopM_, it turns out that local ``go'' function is much faster than loopM_ (loopM_ is still faster than mapM_);<br></div><div>- If I add a signature for loopM_ ( loopM_ :: (Int -> IO ()) -> Int -> Int -> Int -> IO () ), then the program runs noticeable slower even profiling is turned off;</div><div><br></div><div>These really looks odd to me, and I think it really makes optimization painful.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 3, 2015 at 9:06 AM Baojun Wang <<a href="mailto:wangbj@gmail.com">wangbj@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Full source code:<div><br></div><div><a href="https://github.com/wangbj/haskell/blob/master/lcmsum.hs" target="_blank">https://github.com/wangbj/haskell/blob/master/lcmsum.hs</a></div><div><br></div><div>I build the program with:</div><div><br></div><div>ghc -O2 --make -rtsopts -prof -auto-all lcmsum</div><div><br></div><div>and run it with:</div><div><br></div><div>echo -ne '5\n100\n1000\n10000\n100000\n1000000\n'  | ./lcmsum +RTS -sstderr -p</div><div><br></div><div>I've tried use</div><div><br></div><div>``let !ret = (v1+(fromIntegral i) * (fromIntegral v)) in r'' instead, however it didn't make any difference per profiling. (both Array are Unboxed).</div><div><br></div><div>Thanks</div><div></div></div><div dir="ltr"><div>baojun</div></div><div dir="ltr"><div><br><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 3, 2015 at 2:50 AM Tom Ellis <<a href="mailto:tom-lists-haskell-cafe-2013@jaguarpaw.co.uk" target="_blank">tom-lists-haskell-cafe-2013@jaguarpaw.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Fri, Jul 03, 2015 at 08:18:55AM +0000, Baojun Wang wrote:<br>
> Consider below function:<br>
><br>
> f3 :: UArray Int Int -> IOUArray Int Int64 -> Int -> IO ()<br>
> f3 u r i = let !v = u ! i<br>
>             in go (f31 v) i i<br>
>   where f31 v j = readArray r j >>= \v1 -><br>
>           writeArray r j (v1 + (fromIntegral i) * (fromIntegral v))<br>
>         f31 :: Int -> Int -> IO ()<br>
>         go g k s = when (k <= maxn) (<br>
>           g k >> go g (s+k) s )<br>
><br>
> When call f3:<br>
><br>
>   loopM_ (f3 uu res) 1 1 1000000<br>
<br>
Could you provide complete working code (including definitions of uu and<br>
res) and I will have a go at diagnosing.  (My first guess is that you need<br>
to force (v1 + (fromIntegral i) * (fromIntegral v)).)<br>
<br>
Tom<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div></div></div></blockquote></div>