如果我知道将哪个类传递给函数,我该如何解决协议查找?

时间:2013-06-05 22:06:49

标签: optimization clojure protocols

示例:

(defprotocol Foo (foo [x]))
(extend-protocol Foo Long (foo [x] (inc x)))

;; This is the way that I know how to do it... is there a better way?    
(def long-foo (-> #'foo meta :protocol deref :impls (#(get % Long)) :foo))

我感兴趣的是优化多次通话的任务,每次通话都需要很短的时间。我已经从extend-protocol切换到extend,以防止在我的特定情况下进行额外的函数调用。

1 个答案:

答案 0 :(得分:0)

我更怀疑这是你的瓶颈,如果不是你不可能完全改进它而不完全通过定义一个普通函数并让协议实现委托给它来完成协议机制。 / p>

协议调度由Clojure运行时缓存,并且(我认为)JIT知道足够能够推测性地内联它,因此调用协议函数不会比调用普通函数慢得多(这也是通过clojure.lang.IFn接口的多态分派。)