New patch reinstates the three-way check, but puts it in a separate
static method. Performance seems to be just fine.

I wonder if my previous round of benchmarking with the inline
three-way check was somehow flawed... Either that or the JIT is
happier with the new arrangement for some reason. In any case I kind
of like the separate isAlien.


On 13 May 2014 14:47, Michał Marczyk <michal.marc...@gmail.com> wrote:
> Unfortunately the Guava example means that this approach doesn't
> really solve the problem at hand... Thanks for pointing it out.
>
> The earlier version with the three-way test in place of the
> "java.util." check should be semantically correct, at least.
>
>
> On 13 May 2014 14:40, Michał Marczyk <michal.marc...@gmail.com> wrote:
>> Also, = defers to equals in all cases except two: (1) numeric
>> arguments, (2) at least one IPersistentCollection among the arguments.
>>
>> Clojure collections are allowed to determine whether they are = to the
>> other thing or not. So, we should calculate special hashCodes for the
>> java.util collections Clojure collections know about.
>>
>> Other collection types will just use equals for comparisons and so for
>> them we have to return hashCode to preserve =/hash semantics by
>> relying on the equals/hashCode contract -- there is nothing else we
>> can do. Well, strictly speaking we could apply an arbitrary function
>> to hashCode, so murmuring it (as with Strings) is an option; that
>> would come at a performance cost, however (I benchmarked a version
>> that did that), and I don't think there'd be much benefit -- certainly
>> none at all for classes using identity hash codes.
>>
>> Cheers,
>> Michał
>>
>>
>> On 13 May 2014 14:20, Michał Marczyk <michal.marc...@gmail.com> wrote:
>>> It's not just to facilitate inlining, but also to limit the perf hit
>>> for hashing non-collections, some of which make completely reasonable
>>> map keys and set members. I've used the classes Alex Miller mentioned
>>> he was interested in for benchmarking: Class, Character, Var; these
>>> are all good examples, and only one is under Clojure's control.
>>>
>>> I used a "map or map entry or collection" test in earlier versions of
>>> the patch, but switched to the class name hack because the three-way
>>> type check seems to slow down getting to the default case much more
>>> than examining the class name. For types that actually implement
>>> IHashEq, however, the original patch was faster, so I think HotSpot is
>>> happy to inline either version.
>>>
>>>
>>> On 13 May 2014 14:00, Mike Fikes <mikefi...@me.com> wrote:
>>>> To facilitate inlining, the patch calls out to a separate larger method
>>>> which handles a group of cases.
>>>>
>>>> +        if(o.getClass().getName().startsWith("java.util."))
>>>> +                return doalienhasheq(o);
>>>> +        return o.hashCode();
>>>>
>>>>
>>>> I was wondering whether an efficient improvement is possible that would
>>>> support things like Guava ImmutableList.
>>>>
>>>>
>>>> In particular, I was wonder which "default" cases are currently handled by
>>>> the return o.hashCode() above. Replacing the three lines above with
>>>>
>>>>
>>>> +        return doalienhasheq(o);
>>>>
>>>>
>>>> would allow the patch to also handle non-java.util collection
>>>> implementations, but push the "default" cases down into the bottom of that
>>>> method.
>>>>
>>>>
>>>> On Tuesday, May 13, 2014 12:38:54 AM UTC-4, Michał Marczyk wrote:
>>>>>
>>>>> I've posted a patch that makes java.util.{List,Map,Map.Entry,Set}
>>>>> hashes consistent with those of appropriate Clojure collection types
>>>>> on the ticket.
>>>>
>>>> --
>>>> 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.

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