X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=utils.ml;h=b076733991c614ecf0244136a33b24880c89c1d1;hb=1b4d4c7a0537d30e21068f06535c5d3a1af92f88;hp=ce08290178eeb4c8185a0d3fa57c22a8f5616ef4;hpb=09870a49122b3d7048422818dbb0a038513b4d14;p=SXSI%2Fxpathcomp.git diff --git a/utils.ml b/utils.ml index ce08290..b076733 100644 --- 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__ *)