多方法性能

6

使用多方法会对性能产生什么影响?如果我有两个函数名称相同,参数数量相同,只是类型不同(列表 vs. 整数),那么我的性能会受到很大影响吗?

换句话说,给我的向量加法函数命名为“add-vector”,还是保留为“add”或可能的“+”更好?

(为了简单起见,让我们忽略重新定义内置函数“+”可能带来的问题。)


我会回答评论,但由于它与特定的Clojure无关,多方法不应比普通查找产生任何额外的惩罚。也就是说,一种实现策略是混淆名称,使用参数类型进行编码,然后就不会有额外的开销。然而,Clojure使用的实现策略对我来说是未知的,但如果它使用上述机制,则不会有额外的开销。 - jer
是的,由于Clojure是一种动态语言,我认为它不会相同。此外,Clojure使用一个调度函数来生成应用于可用函数列表的键。 - Timothy Baldridge
你可能想要研究一下 clojure.contrib.genericclojure.contrib.generic.*c.c.generic.arithmetic 对你来说可能是最有趣的)。 - Michał Marczyk
2个回答

9

使用多方法会带来性能成本,但除非绝对必要,否则如果它们是最好的抽象,应该继续使用它们。

话虽如此,Clojure 1.2的协议为某些用例提供了一种本地速度替代多方法的方案,并且特别适用于以前可能使用基于类型的分派的多方法的情况。


非常好,我认为这正是我正在寻找的。协议应该允许我为我的向量类“覆盖”+函数。 - Timothy Baldridge

1

由于Clojure可以使用任意的分派函数,因此多方法的额外成本是分派函数的成本加上映射查找的成本。

或者像cemerick所说的那样:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接