File: compilation_metrics.ml

package info (click to toggle)
js-of-ocaml 6.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,932 kB
  • sloc: ml: 135,957; javascript: 58,364; ansic: 437; makefile: 422; sh: 12; perl: 4
file content (61 lines) | stat: -rw-r--r-- 1,899 bytes parent folder | download
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
let compiler = Sys.argv.(1)

let benchmark_name = Sys.argv.(2)

let output = Sys.argv.(3)

let time_re = Str.regexp "^  \\([^ ].*\\): \\([0-9.]+\\)$"

let () =
  let times = Hashtbl.create 16 in
  let last_line = ref "" in
  (try
     while true do
       let l = read_line () in
       (if Str.string_match time_re l 0
        then
          let nm = Str.matched_group 1 l in
          let t = float_of_string (Str.matched_group 2 l) in
          Hashtbl.replace times nm (t +. try Hashtbl.find times nm with Not_found -> 0.));
       last_line := l
     done
   with End_of_file -> ());
  let file_size =
    let file =
      match compiler with
      | "js_of_ocaml" -> output
      | "wasm_of_ocaml" ->
          let dir = Filename.chop_suffix output ".js" ^ ".assets" in
          let contents = Sys.readdir dir in
          let code =
            Array.find_opt (fun nm -> Filename.check_suffix nm ".wasm") contents
          in
          Filename.concat dir (Option.get code)
      | _ -> assert false
    in
    In_channel.(with_open_bin file length)
  in
  let l = Hashtbl.fold (fun nm v rem -> (nm, v) :: rem) times [] in
  let l = List.filter (fun (_, v) -> v > 0.2) l in
  let l = List.map (fun (nm, v) -> "Compilation phases/" ^ nm, "s", v) l in
  let l' =
    Scanf.sscanf !last_line "%f:%f %f" (fun m s mem ->
        [ "Compilation time", "s", (m *. 60.) +. s
        ; "Compilation memory usage", "KiB", mem
        ; "Code size", "KiB", float (Int64.to_int file_size / 1024)
        ])
  in
  Format.printf
    {|{ "name": "%s",
  "results":
    [ { "name": "%s",
        "metrics":@.|}
    (String.capitalize_ascii compiler)
    benchmark_name;
  Format.printf "          [ @[";
  List.iteri
    (fun i (nm, u, v) ->
      if i > 0 then Format.printf ",@ ";
      Format.printf {|{ "name": "%s", "units": "%s", "value": %f }|} nm u v)
    (l' @ l);
  Format.printf "@] ] } ] }@."