On Thu, 7 Jul 2022 10:21:06 GMT, Сергей Цыпанов <[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.
-------------
PR: https://git.openjdk.org/jdk/pull/9407