使用多方法会对性能产生什么影响?如果我有两个函数名称相同,参数数量相同,只是类型不同(列表 vs. 整数),那么我的性能会受到很大影响吗?
换句话说,给我的向量加法函数命名为“add-vector”,还是保留为“add”或可能的“+”更好?
(为了简单起见,让我们忽略重新定义内置函数“+”可能带来的问题。)
使用多方法会对性能产生什么影响?如果我有两个函数名称相同,参数数量相同,只是类型不同(列表 vs. 整数),那么我的性能会受到很大影响吗?
换句话说,给我的向量加法函数命名为“add-vector”,还是保留为“add”或可能的“+”更好?
(为了简单起见,让我们忽略重新定义内置函数“+”可能带来的问题。)
使用多方法会带来性能成本,但除非绝对必要,否则如果它们是最好的抽象,应该继续使用它们。
话虽如此,Clojure 1.2的协议为某些用例提供了一种本地速度替代多方法的方案,并且特别适用于以前可能使用基于类型的分派的多方法的情况。
由于Clojure可以使用任意的分派函数,因此多方法的额外成本是分派函数的成本加上映射查找的成本。
或者像cemerick所说的那样:
(defmulti can-your-dispatch-do-that?
(fn [& _]
(if (= (phase-of-moon) :full)
:do-this
:do-that)))
clojure.contrib.generic
和clojure.contrib.generic.*
(c.c.generic.arithmetic
对你来说可能是最有趣的)。 - Michał Marczyk