OCaml性能根据匹配顺序而定

时间:2013-05-01 16:01:11

标签: performance pattern-matching ocaml

在OCaml中,模式匹配中的顺序与性能之间是否有任何关系?

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

type t = A | B | C

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

match t1 with
  | A -> ...
  | _ -> ...

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

match t1 with
  | B -> ...
  | _ -> ...

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

这是一个难以回答的问题。但是,实际上如果你有一个类型的构造函数都是无效的(即,相当于小整数),并且它们中只有很少一个,但不到一堆大量的它们,代码生成器几乎肯定会使用硬件跳转表,每个可能的值具有基本相同的性能。

一般情况下,在您确定代码的慢速部分之前,我根本不会担心这样的事情。但是,通过重新排序一组无效的构造函数,你几乎没有机会加快速度。