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