> On 21 Nov 2016, at 07:29, Martin Buchholz <marti...@google.com> wrote: > > Un-OK. Sometimes when microbenchmarking, we stumble upon a code sequence that > hotspot likes. I observed 20% improvement with the below, so switching to > that: > > public boolean tryAdvance(Consumer<? super E> action) { > Objects.requireNonNull(action); > final Object[] es = elements; > if (fence < 0) { fence = tail; cursor = head; } // late-binding > final int i; > if ((i = cursor) == fence) > return false; > E e = nonNullElementAt(es, i); > cursor = inc(i, es.length); > action.accept(e); > return true; > } >
Ok. I suppose i should stop being surprised at these kind of things, but would like to know, if you happen to, why such an improvement was gained for explicitly inlining the getFence call. Were you reaching some inlining thresholds in hotspot? Paul. > > On Thu, Nov 17, 2016 at 7:41 PM, Martin Buchholz <marti...@google.com > <mailto:marti...@google.com>> wrote: > > > On Thu, Nov 17, 2016 at 12:03 PM, Paul Sandoz <paul.san...@oracle.com > <mailto:paul.san...@oracle.com>> wrote: > > 843 public boolean tryAdvance(Consumer<? super E> action) { > 844 if (action == null) > 845 throw new NullPointerException(); > 846 int t, i; > 847 if ((t = fence) < 0) t = getFence(); > > Is that for optimisation purposes, since the same check is also performed in > getFence? If so that seems like overkill > > > OK: > > --- src/main/java/util/ArrayDeque.java 18 Nov 2016 03:22:20 -0000 > 1.114 > +++ src/main/java/util/ArrayDeque.java 18 Nov 2016 03:38:23 -0000 > @@ -866,9 +866,8 @@ > public boolean tryAdvance(Consumer<? super E> action) { > if (action == null) > throw new NullPointerException(); > - int t, i; > - if ((t = fence) < 0) t = getFence(); > - if (t == (i = cursor)) > + final int t, i; > + if ((t = getFence()) == (i = cursor)) > return false; > final Object[] es = elements; > cursor = inc(i, es.length); > > > > 848 if (t == (i = cursor)) > 849 return false; > 850 final Object[] es; > 851 action.accept(nonNullElementAt(es = elements, i)); > 852 cursor = inc(i, es.length); >