[10?] RFR: 8193128: Reduce number of implementation classes returned by List/Set/Map.of()
Claes Redestad
claes.redestad at oracle.com
Sat Dec 9 02:45:52 UTC 2017
On 2017-12-09 02:09, John Rose wrote:
> On Dec 8, 2017, at 7:13 AM, Claes Redestad <claes.redestad at oracle.com> wrote:
>> http://cr.openjdk.java.net/~redestad/8193128/open.03/
>>
> + for (int i = elements.length - 1; i > 0; i--) {
>
> There's an OBOE in this line; should be i >= 0.
I thought I tested the lastIndexOf(..) == 0 cases, but obviously only
for the List12 case...
>
> Errors like this are a risk of hand-specializing code.
> It's probably worth it here, but it's still a risk.
>
> For immutable lists, it would be reasonable to recode
> the generic algorithms to use for-loops with integer
> indexes and get(int) access. That will remove
> the unused generality of iterators, and keep only
> the abstraction across get(). The benefits of customized
> inlining (to fold up the funny specialized get methods)
> can probably be obtained like this:
>
> class AbsImmList {
> @ForceInline int indexOf(Object x) {
> for (int i = 0, s = size(); i < s; i++) if (x.equals(this.get(i))) return i;
> }
> }
> final class List12 {
> int indexOf(Object x) { return super.indexOf(x); } // specialize size/get
> }
> final class ListN {
> int indexOf(Object x) { return super.indexOf(x); } // specialize size/get
> }
>
> The optimization of the funny 1/2 loop for List12 should
> unfold into the same code you'd write by hand; if not it's
> a bug to fix in C2. Likewise for the loop in ListN.
I agree, but left this as is for now. If we go the route of re-specifying
behavior of subList we'll want to make sure we get the NPE behavior
of indexOf/lastIndexOf right, too.
>
> — John
>
> P.S. If you are going to hand-specialize, it might be
> easier on the optimizer if you would add in this line
> as needed:
>
> final E[] elements = this.elements; // cache field
>
> Usually C2 gets the same answer, but not always,
> since final fields are not fully trustable, and "might"
> (in some hypothetical system which C2 can't rule out)
> change over a call to Object::equals. OTOH, generic
> coding as above is preferable, and we can fix C2
> to hoist the @Stable elements field if it doesn't already.
Ok.
>
> P.P.S. Why does ListN have arity 1 and arity 2 constructors?
Another left-over from my earlier experiments, removed:
http://cr.openjdk.java.net/~redestad/8193128/open.04/
/Claes
More information about the core-libs-dev
mailing list