2015-07-20 64 views
12

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

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

一种示例情况:

f 1 = 3 
f 2 = 4 

VS

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

ff'编译成相同数目的(在核心和/或较低例如)指令?

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

综合

在性能方面,了解这两种方法有什么好处?

什么时候最好的性能?

+4

您是在问如何从GHC获得核心产出,或者如何使用标准? – jberryman

+1

相关:[Haskell GHC:与N个构造函数匹配的模式的时间复杂度是多少?](http://stackoverflow.com/q/9027384/2751851) – duplode

+0

我倾向于认为模式匹配速度更快,考虑到“Eq”实例通常基于模式匹配。 – AJFarmar

回答

14

不要介意模式与守卫,你可能会问ifcase

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

直接模式匹配的效率取决于类型。在数字的情况下,不要指望有太大的区别,因为这些模式在之下通过等式检查执行。

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