Change the read_procmem function to return the stack size of the process
[SXSI/xpathcomp.git] / include / utils.ml
index 5de5646..a8c865e 100644 (file)
@@ -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,61 @@ 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.print Format.err_formatter "  %fms@\n%!" t ;
+    Logger.print Format.err_formatter "Mem use before: %s@\n%!" s1;
+    Logger.print 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 =
   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.print Format.err_formatter "%s: " msg;
+    if (count != 1) then Logger.print Format.err_formatter "run %i/%i,  "  i count;
+    Logger.print 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
+  (*Logger.print Format.err_formatter "@\n"; *)
+  r
 ;;
 let total_time () =  List.fold_left (+.) 0. !l;;
 
@@ -95,7 +132,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__ *)