2010-06-16 60 views
6

使用多種方法的性能如何?如果我有兩個具有相同名稱的函數,並且只有類型(list和int)不同的參數個數相同,那麼我的性能會受到很大的影響嗎?多方法性能

換句話說,最好是命名我的向量添加函數:「add-vector」或將它保留爲「add」或可能是「+」?

(爲了簡單起見,我們忽略我可能需要重新定義內置函數的問題,比如「+」)。

+0

我會回答,而不是評論,而是因爲它不涉及到Clojure的具體,多方法應該不會產生任何額外的懲罰比正常查找。也就是說,一種實現策略是用參數類型對它們進行編碼,然後不應該有開銷。然而,Clojure使用的實現策略對我來說是未知的,但如果它使用上述機制,則不會有額外的開銷。 – jer 2010-06-16 12:22:49

+0

是的,因爲clojure是一種動態語言,我不認爲它會是一樣的。 clojure也使用派生函數來生成應用於可用函數列表的密鑰。 – 2010-06-16 13:04:51

+0

你可能想看看'clojure.contrib.generic'和'clojure.contrib.generic。*'('c.c.generic.arithmetic'可能是你最感興趣的)。 – 2010-06-16 22:16:31

回答

9

使用多種方法存在性能成本,但除非絕對必要,否則如果它們是最好的抽象,則應繼續使用它們。也就是說,Clojure 1.2的protocols爲某些用例提供了多方法的本地速度替代方案,特別適用於以前可能會使用基於類型的調度的多方法的情況。

+0

非常好,我想這正是我要找的。協議應該允許我「覆蓋」我的向量類的+函數。 – 2010-06-16 13:46:33

1

由於Clojure可以使用任意調度函數,多方法的附加成本是調度函數+地圖查找的成本。

或者像cemerick所說的那樣:

(defmulti can-your-dispatch-do-that? 
    (fn [& _] 
    (if (= (phase-of-moon) :full) 
     :do-this 
     :do-that)))