On Mon, 16 Oct 2023 15:00:42 GMT, Shaojin Wen <[email protected]> wrote:
>> I submitted PR #15555 before, and there were too many changes. I split it
>> into multiple PRs with small changes. This one is one of them.
>>
>> this PR removed the duplicate code for getChars in
>> BigDecimal#StringBuilderHelper, i also make performance faster.
>> Please review and don't hesitate to critique my approach and patch.
>
> Shaojin Wen has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Use StringConcatFactory.makeConcatWithConstants
> Good, narrows it down to what's going on in `prepend(long, byte[], String)`.
> Might boil down to `System.arraycopy`. This method might not be optimized for
> tiny arrays on all platforms. Specializing for single-char case:
>
> ```java
> diff --git a/src/java.base/share/classes/java/lang/String.java
> b/src/java.base/share/classes/java/lang/String.java
> index 9b19d7e2ac1..6eb70925dab 100644
> --- a/src/java.base/share/classes/java/lang/String.java
> +++ b/src/java.base/share/classes/java/lang/String.java
> @@ -4723,7 +4723,11 @@ static void repeatCopyRest(byte[] buffer, int offset,
> int limit, int copied) {
> */
> void getBytes(byte[] dst, int dstBegin, byte coder) {
> if (coder() == coder) {
> - System.arraycopy(value, 0, dst, dstBegin << coder, value.length);
> + if (value.length == 1) {
> + dst[(dstBegin << coder)] = value[0];
> + } else {
> + System.arraycopy(value, 0, dst, dstBegin << coder,
> value.length);
> + }
> } else { // this.coder == LATIN && coder == UTF16
> StringLatin1.inflate(value, 0, dst, dstBegin, value.length);
> }
> ```
>
> .. seem to help the JIT do the right thing consistently, too:
>
> ```
> Benchmark Mode Cnt Score Error Units
> BigDecimals.testSmallToEngineeringString avgt 50 11,757 ± 0,480 ns/op
> ```
This is faster, but can I make this change to String.getBytes in this PR?
-------------
PR Comment: https://git.openjdk.org/jdk/pull/16006#issuecomment-1766584318