Impact of code difference in Collection#contains() worth improving?

Vitaly Davidovich vitalyd at gmail.com
Thu Aug 28 17:49:34 UTC 2014


Also, micro optimization conversations at this scale would have a leg to
stand on if we were talking about a tight loop with very simple
instructions around it with no memory chasing; this is LinkedList traversal
with equality checking we're talking about.

Sent from my phone
On Aug 28, 2014 1:46 PM, "Vitaly Davidovich" <vitalyd at gmail.com> wrote:

> There's no register pressure - the immediate (I.e. -1) is encoded directly
> into the instruction, just like 0 would be.  The time when 0 is
> particularly useful is when you test for it in the zero bit of the flags
> register (e.g. dec followed by jz, such as when counting a loop down to
> 0).  Otherwise, I don't see any advantage from machine code perspective.
> The aforementioned cmov instruction is not without its own downsides, so
> it's unclear which is better when branch probability isn't known a priori.
>
> The 1 byte code is unlikely to make any difference, unless jit is turned
> off and you're running this through a tight loop in the interpreter (but if
> one does that, perf conversation is moot :)).
>
> Sent from my phone
> On Aug 28, 2014 1:28 PM, "Ulf Zibis" <Ulf.Zibis at cosoco.de> wrote:
>
>>
>> Am 27.08.2014 um 17:51 schrieb Martin Buchholz:
>>
>>> The ArrayList version saves one byte of bytecode, and is therefore very
>>> slightly better.  We should bless that version and use it consistently.
>>>
>>
>> +1
>> Additional argument:
>> The LinkedList code requires to load 32/64-Bit -1 into CPU. This may take
>> some time on some CPU and at least wastes memory footprint.
>> Additionally register pressure increases.
>> Vitaly, please correct me, if I'm wrong, just for learning more.
>>
>> Another advantage is that there is no problem if some implementation of
>> indexOf() erroneously returns another negative value than -1. I remember
>> some compare() implementations, which sometimes return different values
>> than only -1, 0, +1.
>>
>> -Ulf
>>
>>  ArrayList:
>>>>
>>>>      public boolean contains(Object o) {
>>>>          return indexOf(o) >= 0;
>>>>      }
>>>>
>>>> LinkedList:
>>>>
>>>>      public boolean contains(Object o) {
>>>>          return indexOf(o) != -1;
>>>>      }
>>>>
>>>>
>>



More information about the core-libs-dev mailing list