diff --git a/src/lib_benchmark/generator.ml b/src/lib_benchmark/generator.ml index dfc5ad2b900499b9003dfb5024dc80e1e3f49983..77a4882715862339ffc0351d0f0dbf20120731f7 100644 --- a/src/lib_benchmark/generator.ml +++ b/src/lib_benchmark/generator.ml @@ -45,6 +45,8 @@ type 'workload benchmark = measure : unit -> float; } -> 'workload benchmark + (** Calculated provides its own [measure] function, unlike the other + benchmarks where [Measure] module times their closures *) | Plain : { workload : 'workload; closure : unit -> unit; diff --git a/src/lib_benchmark/measure.ml b/src/lib_benchmark/measure.ml index 2f9fd0ce7b6e470c2a8f84dfec68cd04e4f46ad9..e7fd1b909d22e5b8b42b096b2e8ad8bc5cb83dca 100644 --- a/src/lib_benchmark/measure.ml +++ b/src/lib_benchmark/measure.ml @@ -372,6 +372,15 @@ module Time = struct dt [@@inline always] + let measure_lwt f = + let open Lwt.Syntax in + let bef = get_time_ns () in + let+ res = f () in + let aft = get_time_ns () in + let dt = Int64.(to_float (sub aft bef)) in + (dt, res) + [@@inline always] + let measure_and_return f = let bef = get_time_ns () in let x = f () in @@ -457,8 +466,15 @@ let perform_benchmark (type c t) (options : options) List.fold_left (fun workload_data benchmark_fun -> progress () ; - set_gc_increment () ; - Gc.compact () ; + let bench = benchmark_fun () in + (match bench with + | Generator.Calculated _ -> + (* Calculated already gets its measures. + No need to perform GC. *) + () + | _ -> + set_gc_increment () ; + Gc.compact ()) ; let measure_plain_benchmark workload closure = let measures = compute_empirical_timing_distribution @@ -469,7 +485,7 @@ let perform_benchmark (type c t) (options : options) in {workload; measures} :: workload_data in - match benchmark_fun () with + match bench with | Generator.Calculated {workload; measure} -> let measures = Array.init options.nsamples (fun _ -> measure ()) in let measures = Maths.vector_of_array measures in diff --git a/src/lib_benchmark/measure.mli b/src/lib_benchmark/measure.mli index f59f11fe2ce3207e8e9e6ffbe84bfafc8764359d..c0aa0b7ccf4ca2bda87e1adf94f1849c77f86281 100644 --- a/src/lib_benchmark/measure.mli +++ b/src/lib_benchmark/measure.mli @@ -82,3 +82,13 @@ val make_timing_probe : (module Compare.COMPARABLE with type t = 't) -> 't Generator.probe val get_free_variable_set : packed_measurement -> Free_variable.Set.t + +module Time : sig + (** All return nano seconds *) + + val measure : (unit -> unit) -> float + + val measure_and_return : (unit -> 'a) -> float * 'a + + val measure_lwt : (unit -> 'a Lwt.t) -> (float * 'a) Lwt.t +end diff --git a/src/lib_shell_benchmarks/io_helpers.ml b/src/lib_shell_benchmarks/io_helpers.ml index dbbf1c9eeb075cb6b4a0472e3a51c7c9c93240c9..c8741c5295f36334b07e23263ddf95801b81a6ba 100644 --- a/src/lib_shell_benchmarks/io_helpers.ml +++ b/src/lib_shell_benchmarks/io_helpers.ml @@ -179,14 +179,17 @@ module Key_map = struct | None -> None | Some subtree -> find_opt tl subtree) - let rec to_seq path acc tree = + let rec to_seq : + String_map.key list -> + (String_map.key list * 'a) Seq.t -> + 'a t -> + (String_map.key list * 'a) Seq.t = + fun path acc tree -> match tree with | Leaf v -> fun () -> Seq.Cons ((List.rev path, v), acc) | Node map -> - String_map.fold - (fun seg subtree acc -> to_seq (seg :: path) acc subtree) - map - acc + Seq.concat_map (fun (seg, subtree) -> to_seq (seg :: path) acc subtree) + @@ String_map.to_seq map let to_seq tree = to_seq [] Seq.empty tree diff --git a/src/lib_shell_benchmarks/io_stats.ml b/src/lib_shell_benchmarks/io_stats.ml index cdb694f51b252b017896d88becb453e0687b1870..91463e16b542821bdba431ece7251ffb1403a4e3 100644 --- a/src/lib_shell_benchmarks/io_stats.ml +++ b/src/lib_shell_benchmarks/io_stats.ml @@ -90,14 +90,14 @@ let load_tree context key = Context.fold context key - ~order:`Sorted + ~order:`Undefined ~init:Io_helpers.Key_map.empty ~f:(fun path t tree -> let+ o = Context.Tree.to_value t in match o with | Some bytes -> let len = Bytes.length bytes in - Io_helpers.Key_map.insert path len tree + Io_helpers.Key_map.insert (key @ path) len tree | None -> tree) let context_statistics base_dir context_hash =