_____ Von: caml-list-bounces@yquem.inria.fr [mailto:caml-list-bounces@yquem.inria.fr] Im Auftrag von Tom Gesendet: Dienstag, 25. Juli 2006 17:21 An: caml-list Betreff: Re: [Caml-list] generic Hashtbl.to_array The dirtiest solution: let to_array 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 This is to_array_5 in the table. Dirty and not the fastest. Don't know why. Maybe a in to_array_1 is keept in a register. 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 ()