在OCaml中,模式匹配中的顺序与性能之间是否有任何关系?
例如,如果我声明一个类型:
type t = A | B | C
然后按如下方式执行一些模式匹配:
match t1 with
| A -> ...
| _ -> ...
从性能的角度来看,它是否等同于
match t1 with
| B -> ...
| _ -> ...
假设第一种情况下A的数量与第二种情况中的B数一样多吗?
换句话说,在考虑性能时,我应该担心类型中构造函数声明的顺序吗?
答案 0 :(得分:4)
有一篇论文解释了如何在OCaml中编译模式匹配: “优化模式匹配”,L。Maranget和F. Le Fessant,ICFP'01
它基本上表示语义是“按顺序”,但它通常以最佳方式编译,与行的顺序无关。构造函数的值也无关紧要,它是造成差异的构造函数的数量,即它是由比较树编译还是由跳转表编译。
最优性+穷举性测试使OCaml中的模式匹配可能是该语言最精彩的特征,并且更有效地手动编写“if”级联。
答案 1 :(得分:2)
这是一个难以回答的问题。但是,实际上如果你有一个类型的构造函数都是无效的(即,相当于小整数),并且它们中只有很少一个,但不到一堆大量的它们,代码生成器几乎肯定会使用硬件跳转表,每个可能的值具有基本相同的性能。
一般情况下,在您确定代码的慢速部分之前,我根本不会担心这样的事情。但是,通过重新排序一组无效的构造函数,你几乎没有机会加快速度。