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

Ulf Zibis Ulf.Zibis at CoSoCo.de
Fri Aug 29 20:05:04 UTC 2014


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.Zibis at cosoco.de <mailto: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