Looks fine (bug updated with noreg-perf). I do think we should consider 
promoting a copy of this method to AbstractList as it generally allows for a 
much better implementation than AbstractCollection's contains().

Mike

On Aug 29 2014, at 14:56 , Martin Buchholz <marti...@google.com> wrote:

> Just think - one whole byte saved for each individual change!
> I have a webrev!
> http://cr.openjdk.java.net/~martin/webrevs/openjdk9/pico-optimize-contains/
> https://bugs.openjdk.java.net/browse/JDK-8056951
> 
> Can haz review please?
> 
> 
> On Fri, Aug 29, 2014 at 1:05 PM, Ulf Zibis <ulf.zi...@cosoco.de> wrote:
> 
>> 
>> Am 28.08.2014 um 19:46 schrieb Vitaly Davidovich:
>> 
>> 
>>> 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.
>>> 
>>> 
>> Thanks for explaining this, but a very little nit: the immediate (I.e. -1)
>> uses additional 32/64 bits in code which must be loaded from memory and
>> wastes space in CPU cache or am I wrong? This could be saved with >= 0.
>> 
>> So if unifying the code I agree to Martin's opinion.
>> 
>> -Ulf
>> 
>> 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.zi...@cosoco.de <mailto:
>>> ulf.zi...@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;
>>>                 }
>>> 
>>> 
>>> 
>> 

Reply via email to