From e0823263070af6e0b6f939a2c3206a7c224bcb98 Mon Sep 17 00:00:00 2001 From: Enrico Tassi Date: Wed, 22 Mar 2006 12:27:01 +0000 Subject: [PATCH] profiler on steroids. added -profile-only to specify a regex to choose the profilings to print --- components/extlib/hExtlib.ml | 28 ++++++++++++++++++++-------- components/extlib/hExtlib.mli | 2 +- matita/matitaInit.ml | 10 +++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/components/extlib/hExtlib.ml b/components/extlib/hExtlib.ml index 4296db49b..ded11b9fe 100644 --- a/components/extlib/hExtlib.ml +++ b/components/extlib/hExtlib.ml @@ -29,37 +29,49 @@ let profiling_enabled = ComponentsConf.profiling -let profiling_printings = ref (fun () -> true) +let _ = + if profiling_enabled 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 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)))); { profile = profile } else - function _ -> { profile = fun f x -> f x } + { profile = fun f x -> f x } (** {2 Optional values} *) diff --git a/components/extlib/hExtlib.mli b/components/extlib/hExtlib.mli index 17e2de2bc..c41b2f94c 100644 --- a/components/extlib/hExtlib.mli +++ b/components/extlib/hExtlib.mli @@ -82,7 +82,7 @@ type profiler = { profile : 'a 'b. ('a -> 'b) -> 'a -> 'b } (** @return a profiling function; [s] is used for labelling the total time at * the end of the execution *) val profile : ?enable:bool -> string -> profiler -val set_profiling_printings : (unit -> bool) -> unit +val set_profiling_printings : (string -> bool) -> unit (** {2 Localized exceptions } *) diff --git a/matita/matitaInit.ml b/matita/matitaInit.ml index c2677afdb..5866b74d8 100644 --- a/matita/matitaInit.ml +++ b/matita/matitaInit.ml @@ -240,6 +240,9 @@ let parse_cmdline init_status = "-noprofile", Arg.Unit (fun () -> Helm_registry.set_bool "matita.profile" false), "Turns off profiling printings"; + "-profile-only", + Arg.String (fun rex -> Helm_registry.set "matita.profile_only" rex), + "Activates only profiler with label matching the provided regex"; "-bench", Arg.Unit (fun () -> Helm_registry.set_bool "matita.bench" true), "Turns on parsable output on stdout, that is timings for matitac..."; @@ -272,7 +275,12 @@ let parse_cmdline init_status = args := List.filter (fun x -> x <> "") !args; set_list ~key:"matita.args" args; HExtlib.set_profiling_printings - (fun () -> Helm_registry.get_bool "matita.profile"); + (fun s -> + Helm_registry.get_bool "matita.profile" && + Pcre.pmatch + ~pat:(Helm_registry.get_opt_default + Helm_registry.string ~default:".*" "matita.profile_only") + s); CmdLine :: init_status end else init_status -- 2.39.2