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 = "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
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 Printf.eprintf " %fms\n%!" t ;
68 Printf.eprintf "Mem use before: %s\n%!" s1;
69 Printf.eprintf "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 =
108 let t1 = Unix.gettimeofday () in
110 let t2 = Unix.gettimeofday () in
111 let t = (1000. *. (t2 -. t1)) in
112 Printf.eprintf "%s: " msg;
113 if (count != 1) then Printf.eprintf "run %i/%i, " i count;
114 Printf.eprintf "%fms\n%!" t;
115 if i >= count then (l:= t::!l;r)
119 let total_time () = List.fold_left (+.) 0. !l;;
123 let v = v lor (v lsr 1) in
124 let v = v lor (v lsr 2) in
125 let v = v lor (v lsr 4) in
126 let v = v lor (v lsr 8) in
127 let v = v lor (v lsr 16) in
130 external vb : bool -> int = "%identity"
134 END (* IFNDEF UTILS__ML__ *)