模式匹配是否比守卫更高效?

时间:2015-07-20 21:17:00

标签: haskell ghc

我最近在某处读过模式匹配在运行时发生而不是编译时。 (我正在寻找消息来源,但目前无法找到它。)这是真的吗?如果是这样,功能中的警卫是否具有相同的性能?

阅读这一点对我来说是令人惊讶的,因为我曾经认为GHC能够在编译期间优化一些(可能不是全部)模式匹配决策。这会发生吗?

例如:

f 1 = 3
f 2 = 4

VS

f' a | a == 1 = 3
     | a == 2 = 4

ff'编译到相同数量的指令(例如在Core和/或更低版本中)?

如果我在构造函数上模式匹配而不是值,情况是否有所不同?例如。如果GHC发现总是使用一个构造函数调用某个位置的函数,它是否会以消除运行时检查的方式优化该调用?如果是这样,你能给我一个展示优化产生的例子吗?

总结

在性能方面有哪些有关这两种方法的好处?

什么时候表现更好?

1 个答案:

答案 0 :(得分:14)

不要介意模式与警卫,你也可以问ifcase

模式匹配是优先于等式检查。在Haskell中进行平等检查并不是一件很自然的事情。 Boolean blindness是一个问题,但除了完全相等的检查通常是不可行的 - 例如无限列表永远不会比较平等!

直接模式匹配的效率取决于类型。在数字的情况下,不要期望有太大差异,因为这些模式是通过等式检查实现的

我通常更喜欢模式 - 因为它们更好,可以更高效。平等检查要么同样昂贵,要么可能更昂贵,并且只是非惯用的。只在必要时才使用布尔评估,否则坚持模式(也可以是in guards)!