137 lines
3.9 KiB
OCaml
137 lines
3.9 KiB
OCaml
|
|
let seed = "4EygbdYh+v35vvrmD9YYP4byT5E3H7lTeXJiIj+dQnc="
|
||
|
|
let seed = Base64.decode_exn seed
|
||
|
|
|
||
|
|
let seed =
|
||
|
|
let res = Array.make (String.length seed / 2) 0 in
|
||
|
|
for i = 0 to (String.length seed / 2) - 1 do
|
||
|
|
res.(i) <- (Char.code seed.[i * 2] lsl 8) lor Char.code seed.[(i * 2) + 1]
|
||
|
|
done;
|
||
|
|
res
|
||
|
|
|
||
|
|
let () =
|
||
|
|
let random_seed = seed in
|
||
|
|
Random.full_init random_seed
|
||
|
|
|
||
|
|
let random length =
|
||
|
|
let get _ =
|
||
|
|
match Random.int (10 + 26 + 26) with
|
||
|
|
| n when n < 10 -> Char.(chr (code '0' + n))
|
||
|
|
| n when n < 10 + 26 -> Char.(chr (code 'a' + n - 10))
|
||
|
|
| n -> Char.(chr (code 'A' + n - 10 - 26))
|
||
|
|
in
|
||
|
|
String.init length get
|
||
|
|
|
||
|
|
open Bechamel
|
||
|
|
open Toolkit
|
||
|
|
|
||
|
|
let hash_eq_0 = random 4096
|
||
|
|
let hash_eq_1 = Bytes.to_string (Bytes.of_string hash_eq_0)
|
||
|
|
let chr_into_hash_eq_0 = hash_eq_0.[Random.int 4096]
|
||
|
|
let hash_neq_0 = random 4096
|
||
|
|
|
||
|
|
let hash_neq_1 =
|
||
|
|
let rec go limit =
|
||
|
|
if limit <= 0 then failwith "Impossible to generate different hashes.";
|
||
|
|
let res = random 4096 in
|
||
|
|
if res = hash_neq_0 then go (pred limit) else res
|
||
|
|
in
|
||
|
|
go 10
|
||
|
|
|
||
|
|
let random_chr =
|
||
|
|
let rec go limit =
|
||
|
|
if limit <= 0 then
|
||
|
|
failwith
|
||
|
|
"Impossible to generate a byte which does not appear into hash_neq_0.";
|
||
|
|
let res = Char.chr (Random.int 256) in
|
||
|
|
if not (String.contains hash_neq_0 res) then res else go (pred limit)
|
||
|
|
in
|
||
|
|
go 10
|
||
|
|
|
||
|
|
let test_equal0 =
|
||
|
|
Test.make ~name:"equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.equal hash_eq_0 hash_eq_1)
|
||
|
|
|
||
|
|
let test_equal1 =
|
||
|
|
Test.make ~name:"not equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.equal hash_neq_0 hash_neq_1)
|
||
|
|
|
||
|
|
let cfg = Benchmark.cfg ~start:100
|
||
|
|
|
||
|
|
let test_compare0 =
|
||
|
|
Test.make ~name:"equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.compare_be hash_eq_0 hash_eq_1)
|
||
|
|
let test_compare1 =
|
||
|
|
Test.make ~name:"not equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.compare_be hash_neq_0 hash_neq_1)
|
||
|
|
|
||
|
|
let f_eq_0 (v : int) = v = Char.code chr_into_hash_eq_0
|
||
|
|
let f_neq_0 (v : int) = v = Char.code random_chr
|
||
|
|
|
||
|
|
let test_exists0 =
|
||
|
|
Test.make ~name:"equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.exists_uint8 ~f:f_eq_0 hash_eq_0)
|
||
|
|
let test_exists1 =
|
||
|
|
Test.make ~name:"not equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.exists_uint8 ~f:f_neq_0 hash_neq_0)
|
||
|
|
|
||
|
|
let f_hash_eq_0 (v : int) = v = Char.code chr_into_hash_eq_0
|
||
|
|
let f_random (v : int) = v = Char.code random_chr
|
||
|
|
|
||
|
|
let test_find0 =
|
||
|
|
Test.make ~name:"equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.find_uint8 ~f:f_hash_eq_0 hash_eq_0)
|
||
|
|
let test_find1 =
|
||
|
|
Test.make ~name:"not equal"
|
||
|
|
(Staged.stage @@ fun () -> Eqaf.find_uint8 ~f:f_random hash_neq_0)
|
||
|
|
|
||
|
|
let benchmark () =
|
||
|
|
let ols =
|
||
|
|
Analyze.ols ~bootstrap:0 ~r_square:true ~predictors:Measure.[| run |]
|
||
|
|
in
|
||
|
|
let instances =
|
||
|
|
Instance.[ monotonic_clock ]
|
||
|
|
in
|
||
|
|
let cfg =
|
||
|
|
Benchmark.cfg ~limit:2000 ~stabilize:true ~quota:(Time.second 1.)
|
||
|
|
~start:1000 ~kde:(Some 1000) ()
|
||
|
|
in
|
||
|
|
let test_equal =
|
||
|
|
Test.make_grouped ~name:"equal" ~fmt:"%s %s"
|
||
|
|
[ test_equal0; test_equal1 ]
|
||
|
|
in
|
||
|
|
let test_compare =
|
||
|
|
Test.make_grouped ~name:"compare" ~fmt:"%s %s"
|
||
|
|
[ test_compare0; test_compare1 ]
|
||
|
|
in
|
||
|
|
let test_exists =
|
||
|
|
Test.make_grouped ~name:"exists" ~fmt:"%s %s"
|
||
|
|
[ test_exists0; test_exists1 ]
|
||
|
|
in
|
||
|
|
let test_find =
|
||
|
|
Test.make_grouped ~name:"find" ~fmt:"%s %s"
|
||
|
|
[ test_find0; test_find1 ]
|
||
|
|
in
|
||
|
|
let raw_results =
|
||
|
|
Benchmark.all cfg instances
|
||
|
|
(Test.make_grouped ~name:"benchmark" ~fmt:"%s %s"
|
||
|
|
[ test_equal; test_compare; test_exists; test_find ])
|
||
|
|
in
|
||
|
|
let results =
|
||
|
|
List.map (fun instance -> Analyze.all ols instance raw_results) instances
|
||
|
|
in
|
||
|
|
let pr_bench name value =
|
||
|
|
Format.printf
|
||
|
|
{|{"results": [{"name": "eqaf", "metrics": [{"name": "%s", "value": %f, "units": "ns"}]}]}@.|}
|
||
|
|
name value
|
||
|
|
in
|
||
|
|
let results = Analyze.merge ols instances results in
|
||
|
|
let timings = Hashtbl.find results "monotonic-clock" in
|
||
|
|
Hashtbl.iter
|
||
|
|
(fun c v ->
|
||
|
|
match Analyze.OLS.estimates v with
|
||
|
|
| None -> ()
|
||
|
|
| Some ts -> List.iter (pr_bench c) ts)
|
||
|
|
timings;
|
||
|
|
()
|
||
|
|
|
||
|
|
let () = benchmark ()
|