Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. #time
  2. #r @"..\packages\Hopac\lib\net45\Hopac.Core.dll"
  3. #r @"..\packages\Hopac\lib\net45\Hopac.dll"
  4. #r @"..\packages\Hopac\lib\net45\Hopac.Platform.dll"
  5.  
  6. open Hopac
  7. open Hopac.Infixes
  8.  
  9. let t label f =
  10. let sw = System.Diagnostics.Stopwatch.StartNew ()
  11. let r = f ()
  12. printfn "[%s] done in %ims" label sw.ElapsedMilliseconds
  13. System.GC.Collect()
  14. System.GC.WaitForPendingFinalizers ()
  15. r
  16.  
  17. module ParListHopac =
  18. let rec fib n =
  19. job {
  20. if n < 2L then return n
  21. else
  22. let! r = [fib (n - 2L);fib (n - 1L)] |> Job.seqCollect
  23.  
  24. return r |> Seq.sum }
  25.  
  26. module ParHopac =
  27. let rec fib n =
  28. job {
  29. if n < 2L then return n
  30. else let! (x, y) = fib (n - 2L) <*> fib (n - 1L)
  31. return x + y }
  32.  
  33. module ParAsc =
  34. let rec fib n =
  35. async {
  36. if n < 2L then return n
  37. else
  38. let! x = fib (n - 2L) |> Async.StartChild
  39. let! y = fib (n - 1L)
  40. let! x = x
  41. return x + y }
  42. module SeqAsc =
  43. let rec fib n =
  44. async {
  45. if n < 2L then return n
  46. else
  47. let! x = fib (n - 2L)
  48. let! y = fib (n - 1L)
  49. return x + y }
  50.  
  51. module SeqAscHop =
  52. let fib n = SeqAsc.fib n |> Job.fromAsync
  53.  
  54. module ParHopAsc =
  55. let fib n = ParHopac.fib n |> Job.toAsync
  56.  
  57.  
  58. //~100ms
  59. t "ParHopac" <| fun () -> ParHopac.fib 30L |> Hopac.run
  60. //~100ms
  61. t "ParHopAsc" <| fun () -> ParHopAsc.fib 30L |> Async.RunSynchronously
  62.  
  63. //~410ms
  64. t "SeqAscHop" <| fun () -> SeqAscHop.fib 30L |> Hopac.run
  65. //~410ms
  66. t "SeqAsc" <| fun () -> SeqAsc.fib 30L |> Async.RunSynchronously
  67.  
  68. t "ParListHopac" <| fun () -> ParListHopac.fib 30L |> run
  69.  
  70. t "ParAsc" <| fun () -> ParAsc.fib 30L |> Async.RunSynchronously
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement