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 55 56 57 58 59 60 61 62 63
|
open Eio.Std
let benchmarks = [
"Promise", Bench_promise.run;
"Cancel", Bench_cancel.run;
"Buf_read", Bench_buf_read.run;
"Condition", Bench_condition.run;
"Fiber.yield", Bench_yield.run;
"Mutex", Bench_mutex.run;
"Semaphore", Bench_semaphore.run;
"Stream", Bench_stream.run;
"HTTP", Bench_http.run;
"Eio_unix.Fd", Bench_fd.run;
"File.stat", Bench_fstat.run;
"Path.stat", Bench_stat.run;
"Flow.copy", Bench_copy.run;
"Eio_unix.run_in_systhread", Bench_systhread.run;
]
let usage_error () =
let names = List.map fst benchmarks in
Fmt.epr "Usage: main.exe [%a]@." Fmt.(list ~sep:(any " | ") string) names;
exit 1
let () =
Eio_main.run @@ fun env ->
traceln "Using %s backend" env#backend_id;
let benchmarks =
match Array.to_list Sys.argv with
| [_] -> benchmarks
| [_; name] ->
begin match List.assoc_opt name benchmarks with
| Some run -> [name, run]
| None ->
Fmt.epr "Unknown benchmark %S@." name;
usage_error ()
end
| _ -> usage_error ()
in
let run (name, fn) =
traceln "Running %s..." name;
let metrics = fn env in
`Assoc [
"name", `String name;
"metrics", `List metrics;
]
in
(* The benchmark machine runs an old Docker that blocks pidfd_open *)
(* let uname = Eio.Process.parse_out env#process_mgr Eio.Buf_read.take_all ["uname"; "-a"] in *)
let uname =
let ch = Unix.open_process_in "uname -a" in
let x = input_line ch in
close_in ch;
x
in
Fmt.pr "%a@." (Yojson.Safe.pretty_print ~std:true) @@ `Assoc [
"config", `Assoc [
"uname", `String uname;
"backend", `String env#backend_id;
"recommended_domain_count", `Int (Domain.recommended_domain_count ());
];
"results", `List (List.map run benchmarks);
]
|