RFR: 8035584: (s) ArrayList(c) should avoid inflation if c is empty

Martin Buchholz martinrb at google.com
Tue Mar 11 23:42:16 UTC 2014


I don't see the updated webrev.  Maybe you also fell victim to "rsync to cr
no longer working"?


On Tue, Mar 11, 2014 at 4:34 PM, Mike Duigou <mike.duigou at oracle.com> wrote:

>
> On Feb 21 2014, at 14:56 , Martin Buchholz <martinrb at google.com> wrote:
>
> You should do <tt> -> code conversion separately, and do it pervasively
> across the entire JDK.
>
>
> From your lips to God's ears.... I keep suggesting this along with a
> restyle to official style every time we create new repos. Seems unlikely
> unfortunately as it makes backports harder.
>
> This is not right.
> +     * {@code
> (o==null ? get(i)==null : o.equals(get(i)))}
>
>
> Corrected.
>
> You accidentally deleted a stray space here?
>
> -        this.elementData = EMPTY_ELEMENTDATA;
> +       this.elementData = EMPTY_ELEMENTDATA;
>
>
> Corrected.
>
>      public ArrayList(int initialCapacity) {
> -        super();
>          if (initialCapacity < 0)
>              throw new IllegalArgumentException("Illegal Capacity: "+
>                                                 initialCapacity);
> -        this.elementData = new Object[initialCapacity];
> +        this.elementData = (initialCapacity > 0)
> +                ? new Object[initialCapacity]
> +                : EMPTY_ELEMENTDATA;
>      }
>
> When optimizing for special cases, we should try very hard minimize
> overhead in the common case.  In the above, we now have two branches in the
> common case.  Instead,
>
> if (initialCapacity > 0) this.elementData = new Object[initialCapacity];
> else if (initialCapacity == 0) this.elementData = EMPTY_ELEMENTDATA;
> else barf
>
>
> Corrected.
>
> Thanks as always for the feedback.
>
> Mike
>
>
>
>
> On Fri, Feb 21, 2014 at 2:41 PM, Mike Duigou <mike.duigou at oracle.com>wrote:
>
>> Hello all;
>>
>> This changeset consists of two small performance improvements for
>> ArrayList. Both are related to the lazy initialization introduced in
>> JDK-8011200.
>>
>> The first change is in the ArrayList(int capacity) constructor and forces
>> lazy initialization if the requested capacity is zero. It's been observed
>> that in cases where zero capacity is requested that it is very likely that
>> the list never receives any elements. For these cases we permanently avoid
>> the allocation of an element array.
>>
>> The second change, noticed by Gustav Åkesson, involves the
>> ArrayList(Collection c) constructor. If c is an empty collection then there
>> is no reason to inflate the backing array for the ArrayList.
>>
>> http://cr.openjdk.java.net/~mduigou/JDK-8035584/0/webrev/
>>
>> I also took the opportunity to the <tt></tt> -> {@code } conversion for
>> the javadoc.
>>
>> Enjoy!
>>
>> Mike
>
>
>
>



More information about the core-libs-dev mailing list