Changed building of tag tables and format.
[SXSI/xpathcomp.git] / utils.ml
index ce08290..b076733 100644 (file)
--- a/utils.ml
+++ b/utils.ml
@@ -10,19 +10,27 @@ THEN
     DEFINE INTSIZE = 63
     DEFINE HALFINTSIZE = 31
     DEFINE HALF_MAX_INT = 2305843009213693951
+    DEFINE HPARAM = 65599
+    DEFINE HPARAM2 = 4303228801
+    DEFINE HPARAM3 = 282287506116799
+    DEFINE HPARAM4 = 71034040046345985
 ELSE
     DEFINE WORDSIZE = 32
     DEFINE HALFWORDSIZE = 16
     DEFINE INTSIZE = 31
     DEFINE HALFINTSIZE = 15
     DEFINE HALF_MAX_INT = 536870911
+    DEFINE HPARAM = 65599
+    DEFINE HPARAM2 = 8261505
+    DEFINE HPARAM3 = 780587199
+    DEFINE HPARAM4 = 549173308
 END
 
-(* x+65599*y, as in Hashtbl.hash *)
 
-DEFINE HASHINT2 (x,y) = ((x) + ( ((y) lsl 16) + ((y) lsl 8) - (y)))
-DEFINE HASHINT3 (x,y,z) = (HASHINT2(HASHINT2(x,y),z))
-DEFINE HASHINT4 (x,y,z,t) = (HASHINT2((HASHINT2(HASHINT2(x,y),z)),t))
+DEFINE HASHINT2 (x,y) = ((x)+HPARAM*(y))
+DEFINE HASHINT3 (x,y,z) = ((x)  + (y) * HPARAM + (z) * HPARAM2)
+DEFINE HASHINT4 (x,y,z,t) =  ((x)  + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3)
+DEFINE HASHINT5 (x,y,z,t,u) =  ((x)  + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3 + (u)*HPARAM4)
 
 DEFINE PRIME1 = 7
 DEFINE PRIME2 = 19
@@ -38,7 +46,57 @@ DEFINE SMALL_H_SIZE  = PRIME2
 DEFINE MED_H_SIZE    = PRIME5
 DEFINE BIG_H_SIZE    = PRIME8
 
+DEFINE SMALL_A_SIZE  = 128
+DEFINE MED_A_SIZE = 2048
+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 = "VmRSS" 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
+  (s' = pattern)
+  in
+  let rec loop () =
+    let s = input_line cin in
+    if matchline s then s
+    else loop ()
+  in
+  let s = try loop() with _ -> "Could not read mem!"
+  in
+  close_in cin;
+  s
+;;
+
+let l = ref [] ;;
+let init_timer() = l := [];;
+let time_mem f x =
+  let s1  = read_procmem() in
+  let t1 = Unix.gettimeofday () in
+  let r = f x in
+  let s2  = read_procmem() in
+  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;
+    r
+;;
+let time f ?(count=1) ?(msg="") x =
+  let rec loop i = 
+  let t1 = Unix.gettimeofday () in
+  let r = f x in
+  let t2 = Unix.gettimeofday () in 
+  let t = (1000. *. (t2 -. t1)) in
+  Printf.eprintf "%s: run %i/%i,  %fms\n%!" msg i count t;
+  if i >= count then  (l:= t::!l;r)
+  else loop (i+1) 
+  in loop 1
+;;
+let total_time () =  List.fold_left (+.) 0. !l;;
 
 END (* IFNDEF UTILS__ML__ *)