ok, donc je fais 14 # Problème Project Euler, et je bidouiller avec des optimisations afin de se sentir f # out.F #: Dites-moi ce que je suis absent sur l'utilisation Async.Parallel
dans le code suivant:
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()
Pourquoi le code exécuté Async.Parallel vraiment lent par rapport à la carte vers le haut? Je sais que je ne devrais pas voir beaucoup d'effet, puisque je suis seulement sur un mac dual core.
S'il vous plaît noter que je ne veux pas que l'aide de résolution de problèmes # 14, je veux juste savoir ce qui se passe avec mon code parallèle.
Pourquoi le faire en parallèle puis le faire de manière synchrone? Votre tuyauterie semble étrange. –
Parce que je ne sais pas comment obtenir les valeurs? J'ai été sous l'impression qu'Async.Parallel vous donne une liste configurée pour être traitée en parallèle, puis Async.RunSynchronously exécute la séquence Async.Parallel-isée et attend qu'elle se termine (mais elle est traitée en parallèle) –