Split the Options module in two to remove a circular dependency in
[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 = "VmStk" 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     Logger.verbose Format.err_formatter "  %fms@\n%!" t ;
68     Logger.verbose Format.err_formatter "Mem use before: %s@\n%!" s1;
69     Logger.verbose Format.err_formatter "Final Mem: %s@\n@\n@\n%!" s2;
70     r
71 ;;
72
73 let pid = ref 0
74 let start_perf () =
75
76   let ppid = Unix.getpid() in
77   let cmd = "/usr/bin/perf" in
78   if not (Sys.file_exists cmd) then (failwith "Binary '/usr/bin/perf' not found");
79   let args = [| cmd; "stat"; "--pid=" ^ (string_of_int ppid);
80                 "-e"; "L1-dcache-load";
81                 "-e"; "L1-dcache-load-misses";
82                 "-e"; "L1-dcache-store";
83                 "-e"; "L1-dcache-store-misses";
84                 "-e"; "L1-icache-load";
85                 "-e"; "L1-icache-load-misses";
86                 "-e"; "branch-load";
87                 "-e"; "branch-load-misses";
88                 "-e"; "cpu-cycles";
89                 "-e"; "stalled-cycles-frontend";
90                 "-e"; "stalled-cycles-backend";
91                 "-e"; "instructions";
92                 "-e"; "cache-references";
93                 "-e"; "cache-misses";
94                 "-e"; "branch-instructions";
95                 "-e"; "branch-misses";
96                 "-e"; "bus-cycles";
97              |] in
98   let p =  Unix.fork() in
99   pid := p;
100   if !pid == 0 then Unix.execv cmd args
101
102 let stop_perf () =
103   Unix.kill !pid Sys.sigint
104
105 let time f ?(count=1) ?(msg="") x =
106   if not !Config.verbose then f x
107   else
108   let rec loop i =
109     Gc.compact();
110     let oldstack = read_procmem () in
111     let t1 = Unix.gettimeofday () in
112     let r = f x in
113     let t2 = Unix.gettimeofday () in
114     let t = (1000. *. (t2 -. t1)) in
115     Logger.verbose Format.err_formatter "%s: " msg;
116     if (count != 1) then Logger.verbose Format.err_formatter "run %i/%i,  "  i count;
117     Logger.verbose Format.err_formatter "%fms (stack size: before=%s, after=%s)@\n" t oldstack (read_procmem());
118     if i >= count then  (l:= t::!l;r)
119     else loop (i+1)
120   in
121   let r = loop 1 in
122   r
123 ;;
124 let total_time () =  List.fold_left (+.) 0. !l;;
125
126 let next_power2 v =
127   let v = v - 1 in
128   let v = v lor (v lsr 1) in
129   let v = v lor (v lsr 2) in
130   let v = v lor (v lsr 4) in
131   let v = v lor (v lsr 8) in
132   let v = v lor (v lsr 16) in
133     v+1
134
135 external vb : bool -> int = "%identity"
136 let compare_int x y = vb (x > y) - vb (x < y)
137 let compare_int_unsafe x y = x - y
138
139
140 END (* IFNDEF UTILS__ML__ *)