Hi Claes, indeed, seems that this change breaks the zeroing optimization,
so ensureCapacityInternal() becomes slower when the char count is
comparable with the array length. Thanks.

On 22 February 2018 at 18:35, Claes Redestad <claes.redes...@oracle.com>
wrote:

> Hi,
>
> interesting - do you have any numbers showing a benefit from doing this
> (on various sets of input)?
>
> My concerns are that count might typically be close enough to value.length
> to make the difference small in practice, and that there are some (fragile)
> JIT optimizations to try and avoid zeroing out the newly allocated array
> that we have to take care not to break.
>
> /Claes
>
>
> On 2018-02-22 17:51, Roman Leventov wrote:
>
>> AbstractStringBuilder.ensureCapacityInternal() doesn't need to copy the
>> whole underlying array, only the part until the current count.
>>
>> diff --git
>> a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>> b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>> --- a/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>> +++ b/src/java.base/share/classes/java/lang/AbstractStringBuilder.java
>> @@ -140,11 +140,12 @@
>>        * overflow, this method throws {@code OutOfMemoryError}.
>>        */
>>       private void ensureCapacityInternal(int minimumCapacity) {
>> +        byte[] oldValue = value;
>>           // overflow-conscious code
>> -        int oldCapacity = value.length >> coder;
>> +        int oldCapacity = oldValue.length >> coder;
>>           if (minimumCapacity - oldCapacity > 0) {
>> -            value = Arrays.copyOf(value,
>> -                    newCapacity(minimumCapacity) << coder);
>> +            value = new byte[newCapacity(minimumCapacity) << coder];
>> +            System.arraycopy(oldValue, 0, value, 0, count << coder);
>>           }
>>       }
>>
>
>

Reply via email to