File: bench_mutex.ml

package info (click to toggle)
ocaml-eio 1.3-2
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 2,548 kB
  • sloc: ml: 14,608; ansic: 1,237; makefile: 25
file content (54 lines) | stat: -rw-r--r-- 1,520 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
open Eio.Std

let v = ref 0

let run_worker ~iters_per_thread mutex =
  for _ = 1 to iters_per_thread do
    Eio.Mutex.lock mutex;
    let x = !v in
    v := x + 1;
    Fiber.yield ();
    assert (!v = x + 1);
    v := x;
    Eio.Mutex.unlock mutex;
  done

let run_bench ~domain_mgr ~clock ~use_domains ~iters_per_thread ~threads =
  let mutex = Eio.Mutex.create () in
  Gc.full_major ();
  let t0 = Eio.Time.now clock in
  Switch.run (fun sw ->
      for _ = 1 to threads do
        Fiber.fork ~sw (fun () ->
            if use_domains then (
              Eio.Domain_manager.run domain_mgr @@ fun () ->
              run_worker ~iters_per_thread mutex
            ) else (
              run_worker ~iters_per_thread mutex
            )
          )
      done
    );
  assert (!v = 0);
  let t1 = Eio.Time.now clock in
  let time_total = t1 -. t0 in
  let n_iters = iters_per_thread * threads in
  let time_per_iter = time_total /. float n_iters in
  Metric.create
    (Printf.sprintf "iterations=%d threads=%d" n_iters threads)
    (`Float (1e9 *. time_per_iter)) "ns" "Time to update a shared counter"

let main ~domain_mgr ~clock =
  [false, 1_000_000, 1;
   false, 1_000_000, 2;
   false,   100_000, 8;
   true,    100_000, 1;
   true,     10_000, 2;
   true,     10_000, 8]
  |> List.map (fun (use_domains, iters_per_thread, threads) ->
      run_bench ~domain_mgr ~clock ~use_domains ~iters_per_thread ~threads)

let run env =
  main
    ~domain_mgr:(Eio.Stdenv.domain_mgr env)
    ~clock:(Eio.Stdenv.clock env)