On Mon, 2 Oct 2023 05:40:03 GMT, 温绍锦 <d...@openjdk.org> 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, Here are the 
> numbers run on a MacBook M1 Pro:
> 
> 
> -Benchmark                                 Mode  Cnt     Score    Error  
> Units (baseline)
> -BigDecimals.testHugeToEngineeringString   avgt   15   228.102 ? 12.568  ns/op
> -BigDecimals.testLargeToEngineeringString  avgt   15    53.814 ?  0.180  ns/op
> -BigDecimals.testSmallToEngineeringString  avgt   15    17.521 ?  0.521  ns/op
> -BigDecimals.testToEngineeringString       avgt   15  1814.858 ? 64.432  ns/op
> 
> +Benchmark                                 Mode  Cnt     Score    Error  
> Units ()
> +BigDecimals.testHugeToEngineeringString   avgt   15   209.579 ?  5.037  
> ns/op (+8.84)
> +BigDecimals.testLargeToEngineeringString  avgt   15    29.617 ?  0.557  
> ns/op (+81.70)
> +BigDecimals.testSmallToEngineeringString  avgt   15    11.230 ?  0.075  
> ns/op (+56.02)
> +BigDecimals.testToEngineeringString       avgt   15  1732.913 ? 33.629  
> ns/op (+4.73)
> 
> 
> Please review and don't hesitate to critique my approach and patch.

src/java.base/share/classes/java/math/BigDecimal.java line 4216:

> 4214:             int lowInt = (int) intCompact - highInt * 100;
> 4215:             int highIntSize = JLA.stringSize(highInt);
> 4216:             byte[] buf = new byte[highIntSize + 3];

I think the String concat indy call site already generates code that computes 
the size of the char array to be allocated (remember the lengthCoder from 
String Concat). We can probably just use `highInt + '.' + 
StringBuilderHelper.DIGIT_TENS[lowInt] + 
StringBuilderHelper.DIGIT_ONES[lowInt]`.

src/java.base/share/classes/java/math/BigDecimal.java line 4253:

> 4251:                 buf.append('0');
> 4252:                 buf.append('.');
> 4253:                 for (; pad>0; pad--) {

Can probably use `buf.repeat('0', pad)` now

src/java.base/share/classes/java/math/BigDecimal.java line 4280:

> 4278:         } else {
> 4279:             offset = 0;
> 4280:             coeff  = intVal.abs().toString().toCharArray();

It seems `coeff` is no longer modified after this point. I think you can just 
use a `String` for `coeff`, and `String` is already coder-optimized, you don't 
need to expose a StringBuilder.append via JLA.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/16006#discussion_r1349723167
PR Review Comment: https://git.openjdk.org/jdk/pull/16006#discussion_r1349712188
PR Review Comment: https://git.openjdk.org/jdk/pull/16006#discussion_r1349717218

Reply via email to