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。
答案 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)