根据匹配顺序 OCaml 性能

ano*_*nol 1 performance ocaml pattern-matching

在 OCaml 中,模式匹配中的顺序和性能之间有什么关系吗?

例如,如果我声明一个类型:

type t = A | B | C
Run Code Online (Sandbox Code Playgroud)

然后执行一些模式匹配如下:

match t1 with
  | A -> ...
  | _ -> ...
Run Code Online (Sandbox Code Playgroud)

从性能的角度来看,是否等价于

match t1 with
  | B -> ...
  | _ -> ...
Run Code Online (Sandbox Code Playgroud)

假设在第一种情况下,A 的数量与第二种情况中的 B 的数量一样多?

换句话说,在考虑性能时,我是否应该担心类型中构造函数的声明顺序?

Fab*_*ant 5

有一篇论文解释了如何在 OCaml 中编译模式匹配:“优化模式匹配”,L. Maranget 和 F. Le Fessant,ICFP'01

它基本上说语义是“按顺序”的,但它通常以最佳方式编译,与行的顺序无关。构造函数的值也不重要,重要的是构造函数的数量,即它是由比较树编译的,还是由跳转表编译的。

最优性 + 穷举性测试使得 OCaml 中的模式匹配可能是该语言最美妙的特性,并且比手动编写“if”级联更有效。