2015-07-20 63 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)!