On Sun, 9 Apr 2023 02:28:37 GMT, Tingjun Yuan <[email protected]> wrote:
>> In the current implementation of `String.join(CharSequence, Iterable)`, the
>> temp array `elems` is always initialized with a length of 8. It will cause
>> many array recreations when the `Iterable` contains more than 8 elements.
>> Furthermore, it's very common that an `Iterable` is also a `Collection`. So
>> if the `Iterable` is an instance of `Collection`, the initial length of the
>> array can be `((Collection<?>)elements).size()`. It will not change the
>> current behavior even if the `Collection` is modified asynchronously.
>>
>> I don't know whether this change requires a CSR request.
>
> Tingjun Yuan has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Add benchmark
What about setting the initial length to this?
String[] elems;
long initLen = elements.spliterator().estimateSize();
if (initLen < 8L || initLen > Integer.MAX_VALUE - 8L) {
// This usually means the size of the Iterable cannot be computed easily.
elems = new String[8];
} else {
elems = new String[(int)initLen];
}
This doesn't require that `elements` is an instance of `Collection`.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/13383#issuecomment-1501344632