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} *)
(** @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 } *)
"-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...";
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