IFNDEF UTILS__ML__ THEN DEFINE UTILS__ML__ IFDEF WORDSIZE64 THEN INCLUDE "utils64.ml" ELSE INCLUDE "utils32.ml" END DEFINE HASHINT2 (x,y) = ((x)+HPARAM*(y)) DEFINE HASHINT3 (x,y,z) = ((x) + (y) * HPARAM + (z) * HPARAM2) DEFINE HASHINT4 (x,y,z,t) = ((x) + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3) DEFINE HASHINT5 (x,y,z,t,u) = ((x) + (y) * HPARAM + (z)*HPARAM2 + (t)* HPARAM3 + (u)*HPARAM4) DEFINE PRIME1 = 7 DEFINE PRIME2 = 19 DEFINE PRIME3 = 83 DEFINE PRIME4 = 223 DEFINE PRIME5 = 491 DEFINE PRIME6 = 733 DEFINE PRIME7 = 1009 DEFINE PRIME8 = 4093 DEFINE PRIME9 = 65599 (* Magic Constant used for hashing *) DEFINE SMALL_H_SIZE = PRIME2 DEFINE MED_H_SIZE = PRIME5 DEFINE BIG_H_SIZE = PRIME8 DEFINE SMALL_A_SIZE = 128 DEFINE MED_A_SIZE = 2048 DEFINE BIG_A_SIZE = 8192 let read_procmem () = let pid = Unix.getpid() in let cin = open_in (Printf.sprintf "/proc/%i/status" pid) in let pattern = "VmStk" in let matchline s = let l = String.length pattern in if (String.length s) < l then false else let s' = String.sub s 0 l in (s' = pattern) in let rec loop () = let s = input_line cin in if matchline s then s else loop () in let s = try loop() with _ -> "Could not read mem!" in close_in cin; s ;; let l = ref [] ;; let init_timer() = l := [];; let time_mem f x = let s1 = read_procmem() in let t1 = Unix.gettimeofday () in let r = f x in let s2 = read_procmem() in let t2 = Unix.gettimeofday () in let t = (1000. *. (t2 -. t1)) in l:= t::!l; Logger.verbose Format.err_formatter " %fms@\n%!" t ; Logger.verbose Format.err_formatter "Mem use before: %s@\n%!" s1; Logger.verbose Format.err_formatter "Final Mem: %s@\n@\n@\n%!" s2; r ;; let pid = ref 0 let start_perf () = let ppid = Unix.getpid() in let cmd = "/usr/bin/perf" in if not (Sys.file_exists cmd) then (failwith "Binary '/usr/bin/perf' not found"); let args = [| cmd; "stat"; "--pid=" ^ (string_of_int ppid); "-e"; "L1-dcache-load"; "-e"; "L1-dcache-load-misses"; "-e"; "L1-dcache-store"; "-e"; "L1-dcache-store-misses"; "-e"; "L1-icache-load"; "-e"; "L1-icache-load-misses"; "-e"; "branch-load"; "-e"; "branch-load-misses"; "-e"; "cpu-cycles"; "-e"; "stalled-cycles-frontend"; "-e"; "stalled-cycles-backend"; "-e"; "instructions"; "-e"; "cache-references"; "-e"; "cache-misses"; "-e"; "branch-instructions"; "-e"; "branch-misses"; "-e"; "bus-cycles"; |] in let p = Unix.fork() in pid := p; if !pid == 0 then Unix.execv cmd args let stop_perf () = Unix.kill !pid Sys.sigint let time f ?(count=1) ?(msg="") x = if not !Config.verbose then f x else let rec loop i = Gc.compact(); let oldstack = Utils.System.get_status "VmStk" in let t1 = Unix.gettimeofday () in let r = f x in let t2 = Unix.gettimeofday () in let newstack = Utils.System.get_status "VmStk" in let t = (1000. *. (t2 -. t1)) in Logger.verbose Format.err_formatter "%s: " msg; if (count != 1) then Logger.verbose Format.err_formatter "run %i/%i, " i count; Logger.verbose Format.err_formatter "%fms (stack size: before=%s, after=%s)@\n" t oldstack newstack; if i >= count then (l:= t::!l;r) else loop (i+1) in let r = loop 1 in r ;; let total_time () = List.fold_left (+.) 0. !l;; let next_power2 v = let v = v - 1 in let v = v lor (v lsr 1) in let v = v lor (v lsr 2) in let v = v lor (v lsr 4) in let v = v lor (v lsr 8) in let v = v lor (v lsr 16) in v+1 external vb : bool -> int = "%identity" let compare_int x y = vb (x > y) - vb (x < y) let compare_int_unsafe x y = x - y END (* IFNDEF UTILS__ML__ *)