else
let rec loop i =
Gc.compact();
- let oldstack = read_procmem () in
+ let oldstack = Utils.System.get_status "VmStk" in
let t1 = Unix.gettimeofday () in
let r = f x in
let t2 = Unix.gettimeofday () in
+ let newstack = Utils.System.get_status "VmStk" in
let t = (1000. *. (t2 -. t1)) in
Logger.verbose Format.err_formatter "%s: " msg;
if (count != 1) then Logger.verbose Format.err_formatter "run %i/%i, " i count;
- Logger.verbose Format.err_formatter "%fms (stack size: before=%s, after=%s)@\n" t oldstack (read_procmem());
+ Logger.verbose Format.err_formatter "%fms (stack size: before=%s, after=%s)@\n" t oldstack newstack;
if i >= count then (l:= t::!l;r)
else loop (i+1)
in
-open Utils
open Format
let index_empty_texts = ref true
List.iter (fun t ->
if t = "" then ()
else
- match String.explode t ':' with
+ match Utils.String.explode t ':' with
[ tr; lvl ] ->
let l = try int_of_string lvl with _ -> raise (Arg.Bad (lvl)) in
if Logger.is_logger tr then Logger.activate tr l
else raise (Arg.Bad (t))
| _ -> raise (Arg.Bad (t))
- ) (String.explode s ',')
+ ) (Utils.String.explode s ',')
let pretty_loggers () =
ignore(flush_str_formatter());
loop 0
end
;;
+
+module System =
+struct
+ let status () =
+ let pid = Unix.getpid() in
+ let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in
+ let h = Hashtbl.create 17 in
+ try
+ while true do
+ let s = input_line cin in
+ Scanf.sscanf s "%s@: %s@\n" (fun k v ->
+ Hashtbl.replace h k v)
+ done;
+ (* never reached *)
+ h
+ with
+ End_of_file -> begin
+ close_in cin;
+ h
+ end
+ let get_status s = Hashtbl.find (status()) s
+
+ let pr_mem_status fmt h =
+ Format.fprintf fmt "[";
+ List.iter (fun k ->
+ let v = Hashtbl.find h k in
+ Format.fprintf fmt "%s= %s " k v
+ ) [ "VmStk"; "VmRSS"; "VmPeak" ];
+ Format.fprintf fmt "]"
+
+end
+(*
+let time f ?(count=1) ?(msg="") x =
+ if not !Options.verbose then f x
+ else
+ let rec loop i =
+ Gc.compact();
+ let oldmem = System.status () in
+ let t1 = Unix.gettimeofday () in
+ let r = f x in
+ let t2 = Unix.gettimeofday () in
+ let newmem = System.status () in
+ let t = (1000. *. (t2 -. t1)) in
+ Logger.verbose Format.err_formatter "%s: " msg;
+ if (count != 1) then Logger.verbose Format.err_formatter "run %i/%i, " i count;
+ Logger.verbose
+ Format.err_formatter
+ "%fms (before: %a, after: %a)@\n" t System.pr_mem_status oldmem System.pr_mem_status newmem;
+ if i >= count then r
+ else loop (i+1)
+ in
+ loop 1
+
+;;
+*)