执行相同的函数比将结果与变量相关联差两倍?

时间:2018-01-09 12:56:20

标签: functional-programming ocaml caml-light

有人告诉我,第一段代码在性能方面比第二段差。

但是,老实说,如果最终发出同样的电话,我真的无法弄清楚它们会有什么不同。 我错过了什么吗?

显式调用的第一个例子:

#let rec max l =
match l with
x::[]->x
| x::xs -> if(x > max xs) 
     then x else max xs;;

使用变量的第二个例子:

#let rec max l =
match l with
x::[]->x
| x::xs -> let m = max xs
in
if (x>m) then x else m;;

1 个答案:

答案 0 :(得分:6)

关键是ocaml编译器不知道max xsmax xs是同一个东西,所以你的第一个例子相当于:

let rec max l =
  match l with
   | x::[]-> x
   | x::xs ->
     let m1 = max xs in (* first call *)
     if (x > m1) then
       x
     else
       let m2 = max xs in
       m2 (* second call *)
;;

只进行一次调用是有效的优化,但在一般情况下不正确。例如:

let f () =
  print_endline "hello";
  print_endline "hello";
  3

不等同于:

let g () =
  let x = print_endline "hello" in
  x;
  x;
  3