X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fextlib%2FhExtlib.ml;h=cf43e15a03677cff942a0ece003cc85ab0ff972b;hb=dd1a439747a9f4448dc1cc845bfa6110db5ade41;hp=4296db49b668acde2ee35efc2aa87e0fe9f2018c;hpb=9d37f725a8c150d2a9e20b24495e0cfdc7969ee6;p=helm.git diff --git a/helm/software/components/extlib/hExtlib.ml b/helm/software/components/extlib/hExtlib.ml index 4296db49b..cf43e15a0 100644 --- a/helm/software/components/extlib/hExtlib.ml +++ b/helm/software/components/extlib/hExtlib.ml @@ -29,37 +29,54 @@ let profiling_enabled = ComponentsConf.profiling -let profiling_printings = ref (fun () -> true) +let something_profiled = ref false + +let _ = + if !something_profiled then + at_exit + (fun _ -> prerr_endline + (Printf.sprintf "!! %-39s %6s %9s %9s %9s" + "function" "#calls" "total" "max" "average")) + +let profiling_printings = ref (fun _ -> true) let set_profiling_printings f = profiling_printings := f type profiler = { profile : 'a 'b. ('a -> 'b) -> 'a -> 'b } -let profile ?(enable = true) = +let profile ?(enable = true) s = if profiling_enabled && enable then - function s -> let total = ref 0.0 in let calls = ref 0 in + let max = ref 0.0 in let profile f x = let before = Unix.gettimeofday () in try incr calls; let res = f x in let after = Unix.gettimeofday () in - total := !total +. (after -. before); + let delta = after -. before in + total := !total +. delta; + if delta > !max then max := delta; res with exc -> let after = Unix.gettimeofday () in - total := !total +. (after -. before); + let delta = after -. before in + total := !total +. delta; + if delta > !max then max := delta; raise exc in at_exit (fun () -> - if !profiling_printings () && !total <> 0. then + if !profiling_printings s && !total <> 0. then + begin + something_profiled := true; prerr_endline - ("!! TOTAL TIME SPENT IN " ^ s ^ " ("^string_of_int !calls^"): " ^ string_of_float !total)); + (Printf.sprintf "!! %-39s %6d %9.4f %9.4f %9.4f" + s !calls !total !max (!total /. (float_of_int !calls))) + end); { profile = profile } else - function _ -> { profile = fun f x -> f x } + { profile = fun f x -> f x } (** {2 Optional values} *)