2014-12-26 4 views
0
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) 

Я использую командуКак правильно установить программу ocaml?

ocamlc unix.cma test.ml 

скомпилировать его в байт-код. Время выполнения, видимо, несколько секунд, но программа печатает 0.000001s.

И если я заменил Unix.gettimeofday() на Sys.time(), то это всего лишь 0.000000s.

Выполнение кода в utop не намного лучше. Это дает около 0,02 секунды, а я считаю не менее 5 с.

Мне интересно, что здесь не так? Я нахожусь в Debian Wheezy, а версия ocaml - 4.02.1.

+0

Вы уверены, что 'Unix.gettimeofday()' оценивается перед 'nothing 0'? Я не знаю OCaml, но это не похоже на то, что это вообще. – Ryan

+0

Почему нет? Я считаю, что он с нетерпением оценен. – user69818

+0

Как говорит @ivg, порядок оценки аргументов функции * не указан *. Устремленность касается того, оцениваются ли они до вызова, а не порядка. –

ответ

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) 
+0

А, я вижу, спасибо. – user69818

Смежные вопросы