1

例子:

(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

4

1 回答 1

0

我相当怀疑这是你的瓶颈,如果它是你不太可能在不完全绕过协议机制的情况下通过定义一个普通函数并让协议实现委托给它来改进它。

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

于 2013-06-06T03:36:47.207 回答