X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Futils.ml;h=8cab636c13c5b9738641792730983e2c9e761d89;hb=046839a3969319f5d38e8f72fe9cb640a639af6c;hp=c5547aae761c24b6fe9737667e8aaf623642eaa5;hpb=43906e89a76c67491e2a567990980df787036088;p=SXSI%2Fxpathcomp.git diff --git a/src/utils.ml b/src/utils.ml index c5547aa..8cab636 100644 --- a/src/utils.ml +++ b/src/utils.ml @@ -22,3 +22,59 @@ struct 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 !Config.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; + begin + Format.pp_open_vbox Format.err_formatter (2 + String.length msg); + Logger.verbose + Format.err_formatter + "@\n| Time: %fms@\n| Memory before: %a@\n| Memory after: %a@\n]@]@]@\n" t System.pr_mem_status oldmem System.pr_mem_status newmem; + end; + if i >= count then r + else loop (i+1) + in + loop 1 +;;