:) so if you're going to do this, is there no base class in the hierarchy where this can be placed (I don't have source in front of me)? That way there's a higher likelihood that the pattern will stay consistent (with new implementations at least).
Sent from my phone On Aug 29, 2014 5:56 PM, "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; >> } >> >> >> >