2013-05-01 75 views
1

在OCaml中,模式匹配和性能的順序之間是否存在任何關係?根據匹配順序的OCaml性能

例如,如果我聲明類型:

type t = A | B | C 

,然後執行一些模式匹配如下:

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

從性能的角度來看,它相當於是

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

假設在第一種情況下,A的數量與B的數量一樣多?

換句話說,在考慮績效時,我是否應該擔心某種類型的構造函數聲明的順序?

回答

4

有論文,解釋模式匹配是如何在OCaml的編譯: 「優化模式匹配」,L. Maranget和F.樂Fessant,ICFP'01

它基本上說,語義是「在順序「,但它通常是以最佳方式編制的,與行的順序無關。構造函數的值也無關緊要,它是造成差異的構造函數的數量,即如果它是由比較樹或跳轉表編譯的。

Optimality +窮舉測試使得OCaml中的模式匹配可能是該語言最精彩的功能,並且手動編寫級聯「if」級聯效率更高。

2

這是一個不可能回答的問題。然而,在實踐中,如果你有一個類型的構造函數都是空的(即等價於小整數),並且它們中只有很少一部分,但是少於一堆,那麼代碼生成器幾乎肯定會使用硬件跳轉表,對於每個可能的值,其性能基本相同。

一般來說,我不會擔心這樣的事情,直到你確定了代碼的緩慢部分。但幾乎沒有機會通過重新排序一組無用的構造函數來加快速度。

+0

對於列表構造函數,結果會不同嗎?例如,如果我正在處理大型列表,因此知道「空列表」的情況會少得多,我應該總是把它放在模式匹配中。 – anol 2013-05-01 16:26:00

+0

您應該編寫代碼以儘可能清楚。有很多很好的研究和努力致力於儘可能快地進行模式匹配。除此之外,我認爲在複雜模式匹配中存在太多的可能性來給出有用的答案。 (也許更有知識的人會願意的。) – 2013-05-01 16:35:44

+0

@dhekir模式匹配完成「就好像按順序」。如果案例之間沒有重疊,就像空列表和非空列表之間的情況一樣,編譯器已經按照他們的意願命令它們。 – 2013-05-01 19:27:18