(* 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")