Rate to_array_4 to_array_3 to_array_5 to_array_1b to_array_2
to_array_1
to_array_4
418+-0/s
-- -16%
-16%
-16%
-17% -18%
to_array_3
497+-3/s
19%
-- [-0%]
[-0%]
-1% -3%
to_array_5
499+-2/s
19%
[0%]
--
[-0%]
-1% -2%
to_array_1b
499+-2/s
19% [0%]
[0%]
--
-1% -2%
to_array_2
504+-2/s
21%
1%
1%
1%
-- -1%
to_array_1
511+-2/s
22%
3%
2%
2%
1% --
Christoph Bauer
(* compile with
ocamlopt -o to_array -I benchmark-0.7
unix.cmxa benchmark-0.7/benchmark.cmx to_array.ml
*)
open Benchmark
let to_array_1 t =
let
dummy = Array.init 0 (fun _ -> raise Not_found)
in
fst
(Hashtbl.fold
(fun k v (a,
i) ->
if i = 0 then
let a = Array.make (Hashtbl.length t) (k, v)
in
(a, 0)
else (a.(i) <- (k, v); (a, i +
1)))
t (dummy,
0))
let to_array_2 t =
let init
_ = fun () -> raise Not_found in
let a = Array.init
(Hashtbl.length t) init in
ignore
(Hashtbl.fold (fun k v i -> a.(i)
<- (fun () -> (k, v)); i+1) t 0);
Array.map (fun f
-> f ()) a
let to_array_3 t =
Array.of_list (Hashtbl.fold (fun a b c -> (a, b) :: c) t [])
let to_array_1b t =
let
a = ref (Array.init 0 (fun _ -> raise Not_found)) in
ignore
(Hashtbl.fold
(fun k v i
->
if i
= 0
then
(a := Array.make (Hashtbl.length t) (k,
v);
i)
else
((!a).(i) <- (k, v); i +
1))
t
0);
!a
let to_array_4 t =
let init
= ref None in
begin try Hashtbl.iter (fun k v -> init
:= Some (k,v); raise Exit) t
with Exit ->
()
end;
match !init
with
| None -> [|
|]
| Some i
->
let a =
Array.make (Hashtbl.length t) i
in
ignore
(Hashtbl.fold (fun k v i -> a.(i) <- (k, v); i + 1) t
0);
a
let to_array_5 t =
let a
= Array.make (Hashtbl.length t) (Obj.magic 0) in
ignore
(Hashtbl.fold (fun k v i -> a.(i) <-
(k, v); i + 1) t 0) ;
a
let h () =
let h =
Hashtbl.create 100000 in
for i = 0 to (Hashtbl.length h)
do
Hashtbl.add h (Random.int max_int)
(Random.int max_int);
done;
h
let main () =
let h = h ()
in
let res = throughputN ~repeat:5 1
[ ("to_array_5", to_array_5,
h);
("to_array_1",
to_array_1, h);
("to_array_1b", to_array_1b, h);
("to_array_2",
to_array_2, h);
("to_array_3", to_array_3,
h);
("to_array_4", to_array_4, h);
]
in
tabulate res
let () = main ()