Clojure 多方法性能

Clojure 多方法性能,clojure,Clojure,使用多种方法对性能的影响是什么?如果我有两个同名的函数,并且相同数量的参数只因类型(list vs.int)不同,那么我的性能会受到很大影响吗 换句话说,最好将我的向量加法函数命名为“addvector”或将其保留为“add”或可能的“+” (为了简单起见,让我们忽略我重新定义内置函数(如“+”)时可能遇到的问题 使用多种方法会带来性能损失,但除非绝对必要,否则如果它们是最好的抽象,您应该继续使用它们 也就是说,Clojure 1.2为某些用例提供了多种方法的本机速度替代方案,并且特别适用于以前

使用多种方法对性能的影响是什么?如果我有两个同名的函数,并且相同数量的参数只因类型(list vs.int)不同,那么我的性能会受到很大影响吗

换句话说,最好将我的向量加法函数命名为“addvector”或将其保留为“add”或可能的“+”


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

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


也就是说,Clojure 1.2为某些用例提供了多种方法的本机速度替代方案,并且特别适用于以前可能使用多方法和基于类型的分派的情况。

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

或者正如塞默里克所说:

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

我会回答而不是评论,但由于它和clojure并没有具体的关系,多方法不应该比正常的查找招致任何额外的惩罚。也就是说,一种实现策略是使用参数类型对名称进行编码,这样就不会有开销。然而,Clojure使用的实现策略对我来说是未知的,但是如果它使用上述机制,将不会有额外的开销。是的,因为Clojure是一种动态语言,我认为它不会是相同的。clojure还使用一个分派函数,该函数生成应用于可用函数列表的键。您可能希望查看
clojure.contrib.generic
clojure.contrib.generic.*
c.c.generic.算术
可能对您最感兴趣)。非常好,我想这正是我想要的。协议应该允许我“覆盖”向量类的+函数。