> From: "Chen Liang" <chen.l.li...@oracle.com> > To: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "core-libs-dev" <core-libs-dev@openjdk.org> > Sent: Sunday, May 11, 2025 5:41:25 PM > Subject: Re: Unnecessary logic is added to removeFirst and removeLast of > ArrayList.
> > where the generated assembly code by the JITs is checked by humans > Is it? At least, it was true during the Java 8 timeframe :) At that time, i was involved in the effort of updating the collection API to use lambdas. I suppose that the introduction of value types will trigger a similar effort (even if it seems less easier to use value types to optimize the collection API because the spec allows a lot of modifications). > I have heard anecdotes that it is still slower than direct array usage, > presumably due to the modCount tracking mechanism. Don't know if escape > analysis and the resulting stack allocation in the compiled code eliminates > that field. I've recently bench array vs arraylist (while testing the performance of StableValue.list()), for 1024 string ("0", "1", "2" etc), on my Mac M2 air, i get // Benchmark Mode Cnt Score Error Units // StableListBench.array avgt 5 427,889 ± 1,553 ns/op // StableListBench.arraylist avgt 5 605,542 ± 1,372 ns/op // StableListBench.asList avgt 5 572,532 ± 2,574 ns/op // StableListBench.list_of avgt 5 615,069 ± 0,341 ns/op // StableListBench.stable_list avgt 5 1897,948 ± 2,119 ns/op with @Benchmark public int list_of () { var sum = 0 ; for ( var item : listof ) { sum += item .length(); } return sum ; } So at least, I can say that on my mac, direct array usage is more efficient. (BTW, using an arraylist is more effcient than using List.of()/List.copyOf() because ListN inherits from the iterator of AbstractList instead of having its own). regards, Rémi > From: core-libs-dev <core-libs-dev-r...@openjdk.org> on behalf of Remi Forax > <fo...@univ-mlv.fr> > Sent: Sunday, May 11, 2025 5:16 AM > To: 임민수 <godmlz...@naver.com> > Cc: core-libs-dev <core-libs-dev@openjdk.org> > Subject: Re: Unnecessary logic is added to removeFirst and removeLast of > ArrayList. > Duplicating the logic is bad in some cases and not that bad in other cases. > Here ArrayList is one of the most used class in Java (with String and > HashMap), > it is heavily optimized (to the point where the generated assembly code by the > JITs is checked by humans), so duplicating the logic is not a bad idea, > From a documentation POV, you do not have to jump through many methods if you > want to see the implementation and in terms of performance, you want the > inlining to be done by hand because the methods of ArrayList are usually deep > in the call graph, so you may reach the inlining threshold right inside > removeFirst(). > In general, you do not optimize applications and libraries the same way. > Usually, you do not optimize application code that often but for a library, > if a > lot of people are using it, it may worth to spend time to optimize for the > benefit of everybody. > regards, > Rémi