On Thu, 7 Jul 2022 18:45:03 GMT, Roger Riggs <[email protected]> wrote:
>> We can skip bounds check and null check for Charset in case we use the array
>> entirely and the Charset is either default one or proven to be non-null.
>>
>> Benchmark results:
>>
>> before
>>
>> Benchmark Mode Cnt Score
>> Error Units
>> StringConstructor.newStringFromArray avgt 50 4,815
>> ± 0,154 ns/op
>> StringConstructor.newStringFromArrayWithCharset avgt 50 4,462
>> ± 0,068 ns/op
>> StringConstructor.newStringFromArrayWithCharsetName avgt 50 8,653
>> ± 0,040 ns/op
>> StringConstructor.newStringFromRangedArray avgt 50 5,090
>> ± 0,066 ns/op
>> StringConstructor.newStringFromRangedArrayWithCharset avgt 50 4,550
>> ± 0,041 ns/op
>> StringConstructor.newStringFromRangedArrayWithCharsetName avgt 50 8,080
>> ± 0,055 ns/op
>>
>> after
>>
>> Benchmark Mode Cnt Score
>> Error Units
>> StringConstructor.newStringFromArray avgt 50 4,595
>> ± 0,053 ns/op
>> StringConstructor.newStringFromArrayWithCharset avgt 50 4,038
>> ± 0,062 ns/op
>> StringConstructor.newStringFromArrayWithCharsetName avgt 50 8,035
>> ± 0,031 ns/op
>> StringConstructor.newStringFromRangedArray avgt 50 4,084
>> ± 0,007 ns/op
>> StringConstructor.newStringFromRangedArrayWithCharset avgt 50 4,014
>> ± 0,008 ns/op
>> StringConstructor.newStringFromRangedArrayWithCharsetName avgt 50 7,466
>> ± 0,071 ns/op
>
> src/java.base/share/classes/java/lang/String.java line 1429:
>
>> 1427: */
>> 1428: public String(byte[] bytes, int offset, int length) {
>> 1429: this(bytes, offset, length, Charset.defaultCharset(),
>> checkBoundsOffCount(offset, length, bytes.length));
>
> Can you avoid the extra constructor by applying `checkBoundOffCount` to the
> offset argument; it returns the offset.
>
> this(bytes, checkBoundsOffCount(offset, length, bytes.length), length,
> Charset.defaultCharset());
>
> or call `Preconditions.checkFromIndexSize` directly.
But if I roll back the added constructor I'll go through existing public one
`public String(byte[] bytes, int offset, int length, Charset charset)` doing
bounds check twice, won't I?
-------------
PR: https://git.openjdk.org/jdk/pull/9407