|
| 1 | +open Mirage_crypto |
| 2 | + |
| 3 | +module Time = struct |
| 4 | + |
| 5 | + let time ~n f a = |
| 6 | + let t1 = Sys.time () in |
| 7 | + for _ = 1 to n do ignore (f a) done ; |
| 8 | + let t2 = Sys.time () in |
| 9 | + (t2 -. t1) |
| 10 | + |
| 11 | + let warmup () = |
| 12 | + let x = ref 0 in |
| 13 | + let rec go start = |
| 14 | + if Sys.time () -. start < 1. then begin |
| 15 | + for i = 0 to 10000 do x := !x + i done ; |
| 16 | + go start |
| 17 | + end in |
| 18 | + go (Sys.time ()) |
| 19 | + |
| 20 | +end |
| 21 | + |
| 22 | +let burn_period = 2.0 |
| 23 | + |
| 24 | +let sizes = [16; 64; 256; 1024; 8192] |
| 25 | +(* let sizes = [16] *) |
| 26 | + |
| 27 | +let burn f n = |
| 28 | + let buf = Mirage_crypto_rng.generate n in |
| 29 | + let (t1, i1) = |
| 30 | + let rec loop it = |
| 31 | + let t = Time.time ~n:it f buf in |
| 32 | + if t > 0.2 then (t, it) else loop (it * 10) in |
| 33 | + loop 10 in |
| 34 | + let iters = int_of_float (float i1 *. burn_period /. t1) in |
| 35 | + let time = Time.time ~n:iters f buf in |
| 36 | + (iters, time, float (n * iters) /. time) |
| 37 | + |
| 38 | +let mb = 1024. *. 1024. |
| 39 | + |
| 40 | +let throughput title f = |
| 41 | + Printf.printf "\n* [%s]\n%!" title ; |
| 42 | + sizes |> List.iter @@ fun size -> |
| 43 | + Gc.full_major () ; |
| 44 | + let (iters, time, bw) = burn f size in |
| 45 | + Printf.printf " % 5d: %04f MB/s (%d iters in %.03f s)\n%!" |
| 46 | + size (bw /. mb) iters time |
| 47 | + |
| 48 | +let bm name f = (name, fun () -> f name) |
| 49 | + |
| 50 | +let benchmarks = [ |
| 51 | + bm "pfortuna" (fun name -> |
| 52 | + let open Mirage_crypto_rng_miou_unix.Pfortuna in |
| 53 | + Miou_unix.run ~domains:2 @@ fun () -> |
| 54 | + let rng = Mirage_crypto_rng_miou_unix.(initialize (module Pfortuna)) in |
| 55 | + let g = create () in |
| 56 | + reseed ~g "abcd" ; |
| 57 | + throughput name (fun buf -> |
| 58 | + let buf = Bytes.unsafe_of_string buf in |
| 59 | + generate_into ~g buf ~off:0 (Bytes.length buf)); |
| 60 | + Mirage_crypto_rng_miou_unix.kill rng) ; |
| 61 | +] |
| 62 | + |
| 63 | +let help () = |
| 64 | + Printf.printf "available benchmarks:\n "; |
| 65 | + List.iter (fun (n, _) -> Printf.printf "%s " n) benchmarks ; |
| 66 | + Printf.printf "\n%!" |
| 67 | + |
| 68 | +let runv fs = |
| 69 | + Format.printf "accel: %a\n%!" |
| 70 | + (fun ppf -> List.iter @@ fun x -> |
| 71 | + Format.fprintf ppf "%s " @@ |
| 72 | + match x with `XOR -> "XOR" | `AES -> "AES" | `GHASH -> "GHASH") |
| 73 | + accelerated; |
| 74 | + Time.warmup () ; |
| 75 | + List.iter (fun f -> f ()) fs |
| 76 | + |
| 77 | + |
| 78 | +let () = |
| 79 | + let seed = "abcd" in |
| 80 | + let g = Mirage_crypto_rng.(create ~seed (module Fortuna)) in |
| 81 | + Mirage_crypto_rng.set_default_generator g; |
| 82 | + match Array.to_list Sys.argv with |
| 83 | + | _::(_::_ as args) -> begin |
| 84 | + try |
| 85 | + let fs = |
| 86 | + args |> List.map @@ fun n -> |
| 87 | + snd (benchmarks |> List.find @@ fun (n1, _) -> n = n1) in |
| 88 | + runv fs |
| 89 | + with Not_found -> help () |
| 90 | + end |
| 91 | + | _ -> help () |
0 commit comments