RFR: 8305774: String.join(CharSequence, Iterable) can be optimized if Iterable is a Collection [v2]
Tingjun Yuan
duke at openjdk.org
Mon Apr 10 05:23:52 UTC 2023
On Sun, 9 Apr 2023 02:28:37 GMT, Tingjun Yuan <duke at openjdk.org> 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
Furthermore, I did not and will not defend against all possible errors.
One possible solution is change the package-private `join` method to accept an `Iterable` rather an `Object[]`, and change `String.join(CharSequence, CharSequence...)` to wrap the array with `Arrays.asList(E...)`, then we don't have to create any copies.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/13383#issuecomment-1501408398
More information about the core-libs-dev
mailing list