let profile str f =
  let timer = ref 0. in
  let calls = ref 0 in
  add_at_exit
    (fun () -> Format.printf "%s: utime = %f  calls = %d\n@ " str !timer !calls);
  (fun x ->
     let start = (Unix.times()).tms_utime in
     let y = f x in
     let finish = (Unix.times()).tms_utime in
       timer := !timer +. (finish -. start);
       calls := !calls + 1;
       y)