On Thu, 7 Jul 2022 10:21:06 GMT, Сергей Цыпанов <d...@openjdk.org> 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