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)
26 DEFINE PRIME9 = 65599 (* Magic Constant used for hashing *)
28 DEFINE SMALL_H_SIZE = PRIME2
29 DEFINE MED_H_SIZE = PRIME5
30 DEFINE BIG_H_SIZE = PRIME8
32 DEFINE SMALL_A_SIZE = 128
33 DEFINE MED_A_SIZE = 2048
34 DEFINE BIG_A_SIZE = 8192
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
47 let s = input_line cin in
51 let s = try loop() with _ -> "Could not read mem!"
58 let init_timer() = l := [];;
60 let s1 = read_procmem() in
61 let t1 = Unix.gettimeofday () in
63 let s2 = read_procmem() in
64 let t2 = Unix.gettimeofday () in
65 let t = (1000. *. (t2 -. t1)) in
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;
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";
87 "-e"; "branch-load-misses";
89 "-e"; "stalled-cycles-frontend";
90 "-e"; "stalled-cycles-backend";
92 "-e"; "cache-references";
94 "-e"; "branch-instructions";
95 "-e"; "branch-misses";
98 let p = Unix.fork() in
100 if !pid == 0 then Unix.execv cmd args
103 Unix.kill !pid Sys.sigint
105 let time f ?(count=1) ?(msg="") x =
106 if not !Config.verbose then f x
110 let oldstack = read_procmem () in
111 let t1 = Unix.gettimeofday () 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)
124 let total_time () = List.fold_left (+.) 0. !l;;
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
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
140 END (* IFNDEF UTILS__ML__ *)