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