【问题标题】:OCaml performance according to matching order根据匹配顺序的OCaml性能
【发布时间】:2013-05-01 16:01:11
【问题描述】:

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

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

type t = A | B | C

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

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

从性能上看,是否相当于

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

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

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

【问题讨论】:

    标签: performance pattern-matching ocaml


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这是一个不可能仔细回答的问题。然而,在实践中,如果你有一个类型,其构造函数都是空的(即,相当于小整数),并且它们的数量非常少,但少于一大堆,代码生成器几乎肯定会使用硬件跳转表,它对每个可能的值具有基本相同的性能。

      一般来说,在您确定代码的慢速部分之前,我根本不会担心这样的事情。但是你几乎不可能通过重新排序一组空构造函数来加快速度。

      【讨论】:

      • 列表构造函数的结果会有所不同吗?例如,如果我正在处理大型列表,因此知道“空列表”的情况发生的频率要低得多,我是否应该始终将其放在模式匹配的最后?
      • 您应该尽可能清晰地编写代码。有很多很好的研究和努力致力于使模式匹配尽可能快。除此之外,我认为复杂模式匹配的可能性太多,无法给出有用的答案。 (也许知识更渊博的人会愿意。)
      • @dhekir 模式匹配是“按顺序”完成的。如果情况之间没有重叠,就像空列表和非空列表之间的情况一样,编译器已经按照自己的意愿对它们进行了排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 2017-08-17
      • 2021-12-25
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      相关资源
      最近更新 更多