F#: Tell me what I'm missing about using Async.Parallel
        Posted  
        
            by JBristow
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by JBristow
        
        
        
        Published on 2010-04-20T21:37:20Z
        Indexed on 
            2010/04/20
            23:13 UTC
        
        
        Read the original article
        Hit count: 463
        
ok, so I'm doing ProjectEuler Problem #14, and I'm fiddling around with optimizations in order to feel f# out.
in the following code:
let evenrule n = n / 2L
let oddrule n = 3L * n + 1L
let applyRule n =
    if n % 2L = 0L then evenrule n
    else oddrule n
let runRules n =
    let rec loop a final =
        if a = 1L then final
        else loop (applyRule a) (final + 1L)
    n, loop (int64 n) 1L
let testlist = seq {for i in 3 .. 2 .. 1000000 do yield i } 
let getAns sq = sq |> Seq.head
let seqfil (a,acc) (b,curr) = if acc = curr then (a,acc) else if acc < curr then (b,curr) else (a,acc)
let pmap f l = 
    seq { for a in l do yield async {return f a} }
    |> Seq.map Async.RunSynchronously
let pmap2 f l = 
    seq { for a in l do yield async {return f a} }
    |> Async.Parallel
    |> Async.RunSynchronously
let procseq f l = l
                  |> f runRules
                  |> Seq.reduce seqfil
                  |> fst
let timer = System.Diagnostics.Stopwatch()
timer.Start()
let ans1 = testlist |> procseq Seq.map // 837799    00:00:08.6251990
printfn "%A\t%A" ans1 timer.Elapsed
timer.Reset()
timer.Start()
let ans2 = testlist |> procseq pmap
printfn "%A\t%A" ans2 timer.Elapsed // 837799   00:00:12.3010250
timer.Reset()
timer.Start()
let ans3 = testlist |> procseq pmap2
printfn "%A\t%A" ans3 timer.Elapsed // 837799   00:00:58.2413990
timer.Reset()
Why does the Async.Parallel code run REALLY slow in comparison to the straight up map? I know I shouldn't see that much of an effect, since I'm only on a dual core mac.
Please note that I do NOT want help solving problem #14, I just want to know what's up with my parallel code.
© Stack Overflow or respective owner