Optimization 如果我知道将传递给函数的类,如何解析协议查找?

Optimization 如果我知道将传递给函数的类,如何解析协议查找?,optimization,clojure,protocols,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)) 我对这项任务的优化很感兴趣,因为这项任

例如:

(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))

我对这项任务的优化很感兴趣,因为这项任务将进行多次调用,每次调用只需很短的时间。我已经从扩展协议切换到扩展协议,以防止在我的特定情况下发生额外的函数调用。

我怀疑这是否是您的瓶颈,如果是这样的话,如果不完全通过定义一个简单的函数并将协议实现委托给它来绕过协议机制,就不可能对其进行改进


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

如果您知道将传递给函数的类,那么您就不需要协议,因为它们用于动态运行时调度,在您的情况下,您已经知道了可以使用简单的函数,想象为每对java基元数组实现一个点积。您必须为每一对定义一个新的fn,因为您需要在每个参数上有类型提示的agets。另一种选择是使用myget协议,这有单独的设计问题,但我想看看结果会是什么样子。使用直接引用aget提示类型的宏定义每对函数是更好的选择。