Source file measurement.ml
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
open Core
type t =
{ name : string
; test_name : string
; file_name : string
; module_name : string
; largest_run : int
; sample_count : int
; samples : Measurement_sample.t array
}
[@@deriving sexp, fields]
let create ~name ~test_name ~file_name ~module_name ~largest_run ~sample_count ~samples =
{ name; test_name; file_name; module_name; largest_run; sample_count; samples }
;;
let save t ~filename =
Verbosity.print_high
"%s: Writing %d samples to file: %s.%!\n"
t.name
t.sample_count
filename;
let = "# " ^ String.escaped t.name in
let = Measurement_sample.field_names_to_string () in
let ls =
List.rev
(Array.foldi t.samples ~init:[] ~f:(fun i ls cur ->
if i < t.sample_count
then Measurement_sample.field_values_to_string cur :: ls
else ls))
in
Out_channel.write_lines filename (header1 :: header2 :: ls)
;;
let load ~filename =
match In_channel.read_lines filename with
| :: :: data ->
let name = String.subo ~pos:2 header1 |> Scanf.unescaped in
let test_name = "" in
let file_name = "" in
let module_name = "" in
let samples =
Array.of_list (List.map data ~f:Measurement_sample.of_field_values_string)
in
let sample_count = Array.length samples in
let largest_run =
Measurement_sample.max samples ~len:sample_count ~field:Measurement_sample.runs
in
{ name; test_name; file_name; module_name; sample_count; largest_run; samples }
| _ -> failwith "Bad header format for saved metrics file."
;;