Before someone dings me on the race condition, imagine I had factored those repeated @cache calls into a (let [value# @cache] ...) expression. The other thing I'm missing is a check for whether the protocol has been changed since the cache entry was created; this would be done by also maintaining an :expected-protocol field and comparing its value to protocol-function's protocol.
-Per On Mon, Mar 22, 2010 at 11:24 PM, Per Vognsen <per.vogn...@gmail.com> wrote: >>>> lookup (find-protocol-method) over the method invocation itself. Is that >>>> the >>>> right way to summarize the performance implications? >>> >>> No, since the result is cached. The real every-call overhead is having to >>> go through the var to detect changes to the protocol, vs the inline-defined >>> case where the implementation of the interface can't change given the same >>> instance class. >> >> Am I saying something different? The cache requires a hash lookup, right? > > I thought the eventual goal was to implement call-site caching in > bytecode? Inline caching isn't feasible due to the direct and indirect > cost of regenerating bytecode. But you can still do non-inline > caching! For the simplest and highest payoff case of monomorphism, it > would look something like this: > > (protocol-function x ...) > > => > > (let [cache# <atom created at compile time>] > (if (= (:expected-type @cache#) (type x)) > ((:expected-function @cache#) x ...) ;; hit > (let [actual-function <look up protocol-function in (type x) the > hard way>] ;; miss > (swap! cache# (constantly {:expected-type (type x), > :expected-function actual-function})) > (actual-function x ...)))) > > It occurs to me that you could even pull off this code transformation > entirely in-language with CL-style compiler macros while leaving alone > references to protocol-function in non-operator position. > > -Per > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en To unsubscribe from this group, send email to clojure+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.