anchor.diff:          Job.result result
       sieve >>= loop 0
   
  -  let run () =
  +  let run n =
  +    printf "HopacPromise: "
       let timer = Stopwatch.StartNew ()
       let ps = run (primes n)
       let d = timer.Elapsed
  -    printf "Primes are %A\n\nLast prime is %A\n\nHopacPromise time %fs\n" ps ps.[ps.Length-1] d.TotalSeconds
  +    printf "%7d - %fs\n" ps.[ps.Length-1] d.TotalSeconds
       
   /////////////////////////////////////////////////////////////////////////
   
  
positive.code:       result.[i] <- p) >>%
      result
  
    let run () =
      let timer = Stopwatch.StartNew ()
      let ps = run (primes n)
      let d = timer.Elapsed
      printf "Primes are %A\n\nLast prime is %A\n\nHopacCh time %fs\n" ps ps.[ps.Length-1] d.TotalSeconds
      
  /////////////////////////////////////////////////////////////////////////
  
  
negative.code:     return result
    }
  
    let run n =
      printf "Async:        "
      use cancelSource = new System.Threading.CancellationTokenSource ()
      let timer = Stopwatch.StartNew ()
      let ps = Async.RunSynchronously (primes n, -1, cancelSource.Token)
      let d = timer.Elapsed
      cancelSource.Cancel ()
      printf "%7d - %fs\n" ps.[ps.Length-1] d.TotalSeconds
  
  /////////////////////////////////////////////////////////////////////////
  
  let inline cleanup () =
    for i=1 to 10 do
      GC.Collect ()
      Threading.Thread.Sleep 50
  
  do let ns = [10; 100; 1000; 10000]
     for n in ns do
       Sequential.run n ; cleanup ()
     for n in ns do
       HopacCh.run n ; cleanup ()
     for n in ns do
       HopacPromise.run n ; cleanup ()
     for n in ns do
       Async.run n ; cleanup ()
  