36334f6a5b77dd9083ca2ab0d36d0659f0df70c9
[SXSI/xpathcomp.git] / utils.ml
1 IFNDEF UTILS_ML__
2 THEN
3 DEFINE UTILS__ML__
4
5
6 IFDEF WORDSIZE64
7 THEN
8     DEFINE WORDSIZE = 64
9     DEFINE HALFWORDSIZE = 32
10     DEFINE INTSIZE = 63
11     DEFINE HALFINTSIZE = 31
12     DEFINE HALF_MAX_INT = 2305843009213693951
13     DEFINE HPARAM = 65599
14     DEFINE HPARAM2 = 4303228801
15     DEFINE HPARAM3 = 282287506116799
16     DEFINE HPARAM4 = 71034040046345985
17 ELSE
18     DEFINE WORDSIZE = 32
19     DEFINE HALFWORDSIZE = 16
20     DEFINE INTSIZE = 31
21     DEFINE HALFINTSIZE = 15
22     DEFINE HALF_MAX_INT = 536870911
23     DEFINE HPARAM = 65599
24     DEFINE HPARAM2 = 8261505
25     DEFINE HPARAM3 = 780587199
26     DEFINE HPARAM4 = 549173308
27 END
28
29
30 DEFINE HASHINT2 (x,y) = ((x)+HPARAM*(y))
31 DEFINE HASHINT3 (x,y,z) = ((x)  + (y) * HPARAM + (z) * HPARAM2)
32 DEFINE HASHINT4 (x,y,z,t) =  ((x)  + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3)
33 DEFINE HASHINT5 (x,y,z,t,u) =  ((x)  + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3 + (u)*HPARAM4)
34
35 DEFINE PRIME1 = 7
36 DEFINE PRIME2 = 19
37 DEFINE PRIME3 = 83
38 DEFINE PRIME4 = 223
39 DEFINE PRIME5 = 491
40 DEFINE PRIME6 = 733
41 DEFINE PRIME7 = 1009
42 DEFINE PRIME8 = 4093
43 DEFINE PRIME9 = 65599 (* Magic Constant used for hashing *)
44
45 DEFINE SMALL_H_SIZE  = PRIME2
46 DEFINE MED_H_SIZE    = PRIME5
47 DEFINE BIG_H_SIZE    = PRIME8
48
49 DEFINE SMALL_A_SIZE  = 128
50 DEFINE MED_A_SIZE = 2048
51 DEFINE BIG_A_SIZE = 8192
52
53
54 let read_procmem () = 
55   let pid = Unix.getpid() in
56   let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in
57   let pattern = "VmRSS" in
58   let matchline s = let l = String.length pattern in
59   if (String.length s) < l then false
60   else let s' = String.sub s 0 l in
61   (s' = pattern)
62   in
63   let rec loop () =
64     let s = input_line cin in
65     if matchline s then s
66     else loop ()
67   in
68   let s = try loop() with _ -> "Could not read mem!"
69   in
70   close_in cin;
71   s
72 ;;
73
74 let l = ref [] ;;
75 let init_timer() = l := [];;
76 let time_mem f x =
77   let s1  = read_procmem() in
78   let t1 = Unix.gettimeofday () in
79   let r = f x in
80   let s2  = read_procmem() in
81   let t2 = Unix.gettimeofday () in 
82   let t = (1000. *. (t2 -. t1)) in
83     l:= t::!l;
84     Printf.eprintf "  %fms\n%!" t ;
85     Printf.eprintf "Mem use before: %s\n%!" s1;
86     Printf.eprintf "Final Mem: %s\n\n\n%!" s2;
87     r
88 ;;
89 let time f ?(count=1) x =
90   let rec loop i = 
91   let t1 = Unix.gettimeofday () in
92   let r = f x in
93   let t2 = Unix.gettimeofday () in 
94   let t = (1000. *. (t2 -. t1)) in
95   Printf.eprintf "run %i/%i,  %fms\n%!" i count t;
96   if i >= count then  (l:= t::!l;r)
97   else loop (i+1) 
98   in loop 1
99 ;;
100 let total_time () =  List.fold_left (+.) 0. !l;;
101
102 END (* IFNDEF UTILS__ML__ *)