如何正确计时ocaml程序?

时间:2014-12-26 01:20:52

标签: unix ocaml

let t = Unix.gettimeofday()
let rec nothing i =
  match i with
  | 1000000000 -> 1
  | _ -> nothing (i+1)
let () = Printf.printf "%d %fs\n" (nothing 0) (Unix.gettimeofday() -. t)

我使用命令

ocamlc unix.cma test.ml

将其编译为字节码。执行时间显然是几秒钟,但程序打印0.000001s。

如果我用Sys.time()替换Unix.gettimeofday(),它只有0.000000s。

utop中运行代码并不是更好。它给出了大约0.02s,而我至少计算了5s。

我想知道这里出了什么问题?我在Debian Wheezy,ocaml版本是4.02.1。

1 个答案:

答案 0 :(得分:2)

printf函数的参数以及任何其他函数都以未指定的顺序进行计算。在您的情况下,(Unix.gettimeofday () -. t)表达式在(nothing 0)之前进行评估。更合适的代码版本是:

let rec nothing i =
  match i with
  | 1000000000 -> 1
  | _ -> nothing (i+1)


let () =
  let t = Unix.gettimeofday() in 
  Printf.printf "%ds\n" (nothing 0);
  Printf.printf "time elapsed: %g s\n" (Unix.gettimeofday() -. t)