ocaml-containers/benchs/run_objsize.ml
Simon Cruanes 10865eaced reformat
2022-07-04 13:36:06 -04:00

94 lines
2.8 KiB
OCaml

(* module Deque = Core_kernel.Deque *)
module Int_map = CCMap.Make (CCInt)
module Int_set = CCSet.Make (CCInt)
let dup = CCPair.dup
let id = CCFun.id
let ns n = List.init n CCFun.id
let iter_range n f = List.iter f (ns n)
let gen_cons x xs =
let saw_x = ref false in
fun () ->
if !saw_x then (
saw_x := true;
Some x
) else
xs ()
let front = Sek.front
let dummy = 0
let types =
[
("Stdlib.List", fun n -> Obj.magic @@ ns n);
("Stdlib.Array", fun n -> Obj.magic @@ Array.init n id);
( "Stdlib.Hashtbl",
fun n -> Obj.magic @@ CCHashtbl.of_iter Iter.(init dup |> take n) );
( "Base.Hashtbl",
fun n -> Obj.magic @@ Base.Hashtbl.Poly.of_alist_exn (List.init n dup) );
( "Stdlib.Map",
fun n -> Obj.magic @@ Int_map.of_iter Iter.(init dup |> take n) );
( "Stdlib.Set",
fun n -> Obj.magic @@ Int_set.of_iter Iter.(init id |> take n) );
("CCFun_vec", fun n -> Obj.magic @@ CCFun_vec.of_list (ns n));
("CCRAL", fun n -> Obj.magic @@ CCRAL.of_list (ns n));
("BatVect", fun n -> Obj.magic @@ BatVect.of_list (ns n));
( "Sek.Persistent",
fun n ->
Obj.magic
@@ List.fold_left
(Sek.Persistent.push front)
(Sek.Persistent.create dummy)
(ns n) );
( "Sek.Ephemeral",
fun n ->
Obj.magic
@@
let c = Sek.Ephemeral.create dummy in
iter_range n (Sek.Ephemeral.push front c);
c );
( "CCVector",
fun n ->
Obj.magic
@@
let c = CCVector.create () in
iter_range n (CCVector.push c);
c );
(* "Core_kernel.Deque", (fun n -> Obj.magic @@ let c = Deque.create () in iter_range n (Deque.enqueue_back c); c); *)
( "Base.Queue",
fun n ->
Obj.magic
@@
let c = Base.Queue.create () in
iter_range n (Base.Queue.enqueue c);
c );
( "Stdlib.Queue",
fun n ->
Obj.magic
@@
let q = Queue.create () in
iter_range n (fun x -> Queue.push x q);
q );
("CCQueue", fun n -> Obj.magic @@ CCDeque.of_list (ns n));
("Iter", fun n -> Obj.magic @@ List.fold_right Iter.cons (ns n) Iter.empty);
("Gen", fun n -> Obj.magic @@ List.fold_right gen_cons (ns n) Gen.empty);
( "Stdlib.Seq",
fun n -> Obj.magic @@ List.fold_right OSeq.cons (ns n) OSeq.empty );
]
let () =
let sizes = [ 0; 1; 10; 100; 1000; 10000 ] in
Printf.printf "%-20s " "";
sizes |> List.iter (fun n -> Printf.printf "%6d " n);
Printf.printf "\n";
types
|> List.iter (fun (name, create) ->
Printf.printf "%-20s: " name;
sizes
|> List.iter (fun n ->
let obj = create n in
let size = Objsize.size_w obj in
(* let size = Obj.reachable_words (Obj.repr obj) in *)
Printf.printf "%6d " size);
Printf.printf "\n")