X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=include%2Futils.ml;h=e61ee191c1505e33787270a178b01c8ae0e32514;hb=798507d52a5c11a6d852740056464241538fe76a;hp=5de564621ca974f3e129976ee057481833f3a051;hpb=4b52da1a20a4fe031930bb96d2ca46bec06dc529;p=SXSI%2Fxpathcomp.git diff --git a/include/utils.ml b/include/utils.ml index 5de5646..e61ee19 100644 --- a/include/utils.ml +++ b/include/utils.ml @@ -37,7 +37,7 @@ DEFINE BIG_A_SIZE = 8192 let read_procmem () = let pid = Unix.getpid() in let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in - let pattern = "VmHWM" in + let pattern = "VmStk" in let matchline s = let l = String.length pattern in if (String.length s) < l then false else let s' = String.sub s 0 l in @@ -64,24 +64,62 @@ let time_mem f x = let t2 = Unix.gettimeofday () in let t = (1000. *. (t2 -. t1)) in l:= t::!l; - Printf.eprintf " %fms\n%!" t ; - Printf.eprintf "Mem use before: %s\n%!" s1; - Printf.eprintf "Final Mem: %s\n\n\n%!" s2; + Logger.verbose Format.err_formatter " %fms@\n%!" t ; + Logger.verbose Format.err_formatter "Mem use before: %s@\n%!" s1; + Logger.verbose Format.err_formatter "Final Mem: %s@\n@\n@\n%!" s2; r ;; + +let pid = ref 0 +let start_perf () = + + let ppid = Unix.getpid() in + let cmd = "/usr/bin/perf" in + if not (Sys.file_exists cmd) then (failwith "Binary '/usr/bin/perf' not found"); + let args = [| cmd; "stat"; "--pid=" ^ (string_of_int ppid); + "-e"; "L1-dcache-load"; + "-e"; "L1-dcache-load-misses"; + "-e"; "L1-dcache-store"; + "-e"; "L1-dcache-store-misses"; + "-e"; "L1-icache-load"; + "-e"; "L1-icache-load-misses"; + "-e"; "branch-load"; + "-e"; "branch-load-misses"; + "-e"; "cpu-cycles"; + "-e"; "stalled-cycles-frontend"; + "-e"; "stalled-cycles-backend"; + "-e"; "instructions"; + "-e"; "cache-references"; + "-e"; "cache-misses"; + "-e"; "branch-instructions"; + "-e"; "branch-misses"; + "-e"; "bus-cycles"; + |] in + let p = Unix.fork() in + pid := p; + if !pid == 0 then Unix.execv cmd args + +let stop_perf () = + Unix.kill !pid Sys.sigint + let time f ?(count=1) ?(msg="") x = + if not !Config.verbose then f x + else let rec loop i = Gc.compact(); - let t1 = Unix.gettimeofday () in - let r = f x in - let t2 = Unix.gettimeofday () in - let t = (1000. *. (t2 -. t1)) in - Printf.eprintf "%s: " msg; - if (count != 1) then Printf.eprintf "run %i/%i, " i count; - Printf.eprintf "%fms\n%!" t; - if i >= count then (l:= t::!l;r) - else loop (i+1) - in loop 1 + let oldstack = read_procmem () in + let t1 = Unix.gettimeofday () in + let r = f x in + let t2 = Unix.gettimeofday () 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()); + if i >= count then (l:= t::!l;r) + else loop (i+1) + in + let r = loop 1 in + r ;; let total_time () = List.fold_left (+.) 0. !l;; @@ -95,7 +133,8 @@ let next_power2 v = v+1 external vb : bool -> int = "%identity" - +let compare_int x y = vb (x > y) - vb (x < y) +let compare_int_unsafe x y = x - y END (* IFNDEF UTILS__ML__ *)