File: custom.ml

package info (click to toggle)
ocaml 5.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 43,124 kB
  • sloc: ml: 355,439; ansic: 51,636; sh: 25,098; asm: 5,413; makefile: 3,673; python: 919; javascript: 273; awk: 253; perl: 59; fortran: 21; cs: 9
file content (45 lines) | stat: -rw-r--r-- 1,343 bytes parent folder | download | duplicates (2)
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
(* TEST *)

module MP = Gc.Memprof
let () = Gc.set { (Gc.get ()) with minor_heap_size = 262144 }

let bigstring_create sz =
  Bigarray.Array1.create Bigarray.char Bigarray.c_layout sz

let keep = ref []

let test sampling_rate =
  let size = 256 in
  let iters = 100_000 in
  let size_words = size / (Sys.word_size / 8) in
  let alloc = ref 0 and collect = ref 0 and promote = ref 0 in
  let tracker =
    { MP.null_tracker with
      alloc_minor = (fun info ->
        if info.source <> Custom then None
        else begin
          alloc := !alloc + info.n_samples;
          Some info.n_samples
        end);
      promote = (fun ns ->
        promote := !promote + ns; None);
      dealloc_minor = (fun ns ->
        collect := !collect + ns) } in
  let _:MP.t = MP.start ~sampling_rate tracker in
  for i = 1 to iters do
    let str = Sys.opaque_identity bigstring_create size in
    if i mod 10 = 0 then keep := str :: !keep
  done;
  keep := [];
  Gc.full_major ();
  MP.stop ();
  assert (!alloc = !promote + !collect);
  let iters = float_of_int iters and size_words = float_of_int size_words in
  (* see comballoc.ml for notes on precision *)
  Printf.printf "%.2f %.1f\n"
    ((float_of_int !alloc /. iters) /. size_words)
    ((float_of_int !promote /. iters) /. size_words *. 10.)


let () =
  [0.01; 0.5; 0.17] |> List.iter test