Clojure is caching protocol implementations explicitly with extra 
bytecodes, not the JVM.  And it is very efficient.

I don't think satisfies? is worth optimizing as using ton of it seems 
antithetical to protocols.  It signals to me that a caller does in fact 
care about the implementation, whereas protocols are about not caring. 
 Like your PR, if you want to ensure a protocol's coverage, you can also 
extend a protocol to Object and/or nil.  Not sure what a valid use case 
would be for calling satisfies? on a hot path would be.

On Thursday, January 22, 2015 at 11:46:02 PM UTC-5, Michael Blume wrote:
>
> Wait isn't this caching? 
> https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_deftype.clj#L480
>
> On Thu Jan 22 2015 at 8:44:09 PM Bobby Eickhoff <beic...@gmail.com 
> <javascript:>> wrote:
>
>> Clojure isn't doing the caching.  The JVM is doing the caching.  In this 
>> case, Clojure just has mechanical sympathy for how the JVM operates.
>>
>>
>> On Thursday, January 22, 2015 at 11:10:56 PM UTC-5, Michael Blume wrote:
>>
>>> It sounds like basically dispatch is fast because we bothered to make it 
>>> fast (by caching) and satisfies? is slow because we didn't. Is it worth 
>>> throwing caching at satisfies? to make it fast or should satisfies? just 
>>> not be on the critical path for Clojure code?
>>>
>>> (To give a motivating example, satisfies? is on the critical path for 
>>> honeysql and will be until this pull is merged: https://github.com/
>>> jkk/honeysql/pull/38)
>>>
>>>
>>> On Thu Jan 22 2015 at 5:52:13 PM Ghadi Shayban <gsha...@gmail.com> 
>>> wrote:
>>>
>>>> Protocol call sites build an inline cache to optimize dispatch.  The 
>>>> benchmark is running many times and reaping benefit from the cache. 
>>>>  satisfies? looks up the object's class in the protocol's implementation 
>>>> map [1], and the benchmark is stressing this.  You'll see that code checks 
>>>> if the protocol has the backing interface first, then checks for the 
>>>> object's class, then if necessary walks up the superclass chain.
>>>>
>>>> [1] https://github.com/clojure/clojure/blob/master/
>>>> src/clj/clojure/core_deftype.clj#L507-L516
>>>>
>>>>
>>>>
>>>> On Thursday, January 22, 2015 at 8:36:23 PM UTC-5, Michael Blume wrote:
>>>>
>>>>> Extends seems to be defeated by superclassing. ie:
>>>>>
>>>>> (extends? my-protocol (class {})) => false
>>>>>
>>>>> because my-protocol is extended to IPersistentMap and (class {}) isn't 
>>>>> IPersistentMap it's PersistentArrayMap (which implements IPersistentMap 
>>>>> but 
>>>>> extends? doesn't care)
>>>>>
>>>>> On Thu Jan 22 2015 at 5:28:30 PM Timothy Baldridge <tbald...@gmail.com> 
>>>>> wrote:
>>>>>
>>>> The logic of extends? is much simpler, so try that. IIRC it's something 
>>>>>> like "extends? returns true if any method on the protocol is implemented 
>>>>>> by 
>>>>>> x", "satisfies? returns true if all methods of a protocol are 
>>>>>> implemented 
>>>>>> by x". 
>>>>>>
>>>>>> The docs don't seem to give much help here, so play with it in the 
>>>>>> repl a bit. 
>>>>>>
>>>>>> Timothy
>>>>>>
>>>>>> On Thu, Jan 22, 2015 at 6:14 PM, Michael Blume <blume...@gmail.com> 
>>>>>> wrote:
>>>>>>
>>>>>>> (defprotocol my-protocol
>>>>>>>   (foo [this]))
>>>>>>>
>>>>>>> (extend-protocol my-protocol
>>>>>>>   clojure.lang.IPersistentMap
>>>>>>>   (foo [this] "hello from map"))
>>>>>>>
>>>>>>> (criterium.core/quick-bench
>>>>>>>   (satisfies? my-protocol {}))
>>>>>>>
>>>>>>> (criterium.core/quick-bench
>>>>>>>   (foo {}))
>>>>>>>
>>>>>>> Simply calling foo on an empty map takes 7 ns,
>>>>>>> but checking whether the map satisfies my-protocol takes 22 µs, 3000 
>>>>>>> times longer.
>>>>>>>
>>>>>>> It seems like to call foo, some mechanism has to look up an 
>>>>>>> implementation of my-protocol for maps -- how is it we can do that so 
>>>>>>> quickly for a call and so slowly for satisfies?
>>>>>>>
>>>>>>>  -- 
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Clojure" group.
>>>>>>>
>>>>>> To post to this group, send email to clo...@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+u...@googlegroups.com
>>>>>>
>>>>>>
>>>>>>> For more options, visit this group at
>>>>>>> http://groups.google.com/group/clojure?hl=en
>>>>>>> --- 
>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>> Groups "Clojure" group.
>>>>>>>
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>>> send an email to clojure+u...@googlegroups.com.
>>>>>>
>>>>>>
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> “One of the main causes of the fall of the Roman Empire was 
>>>>>> that–lacking zero–they had no way to indicate successful termination of 
>>>>>> their C programs.”
>>>>>> (Robert Firth) 
>>>>>>
>>>>>  -- 
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Clojure" group.
>>>>>>
>>>>> To post to this group, send email to clo...@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+u...@googlegroups.com
>>>>>
>>>>>
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/clojure?hl=en
>>>>>> --- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Clojure" group.
>>>>>>
>>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>>> an email to clojure+u...@googlegroups.com.
>>>>>
>>>>>
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>  -- 
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clo...@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+u...@googlegroups.com
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/clojure?hl=en
>>>> --- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Clojure" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>> an email to clojure+u...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>> --- 
>> You received this message because you are subscribed to the Google Groups 
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to clojure+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to