RFR: 8327791: Optimization for new BigDecimal(String) [v6]

Shaojin Wen duke at openjdk.org
Tue Mar 12 13:04:14 UTC 2024


On Tue, 12 Mar 2024 09:41:46 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> Shaojin Wen has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   easier to compare
>
> Sorry, when I got pinged in here the earlier comments didn't render and I missed the conversation.
> 
> So first off I think it's probably acceptable to regress the `char[]`-based constructors and gently push people towards other options. In few applications are `char[]` the source, and in the example mentioned there's a transform from `byte[]` to `char[]` which would probably end up being faster now with `new BigDecimal(new String(bytes, start, end, ISO_8859_1))`. 
> 
> That said perhaps there's room for improvement. Looking at `CharBuffer::charAt` it does surprisingly complicated logic and bounds checks. And the `CharBuffer` wrapper itself is a bit bloated due quite a few state variables (that we don't need for this use case). I did an experiment with a specialized implementation here: https://github.com/wenshao/jdk/pull/7 which yields good results. Not sure this is a great idea but something to consider (note that it's not general purpose since it's exploiting a deliberately missing bounds check in `charAt`).

Thanks to @cl4es for pointing out my problem. I removed the curly braces not for change, and I don’t like this coding style either, but to try to be consistent with the coding style of the context.

I found that the CharArraySequence implementation without offset and length has better performance, so there are two implementations.

In the current version, the testConstructorWithSmallCharArray scene has a performance drop of 5.73%, and the performance of other scenes has improved.


-Benchmark                                      Mode  Cnt    Score   Error  Units (base)
-BigDecimals.testConstructorWithSmallCharArray  avgt   15   16.445 ? 0.050  ns/op
-BigDecimals.testConstructorWithLargeCharArray  avgt   15   90.470 ? 1.250  ns/op
-BigDecimals.testConstructorWithHugeCharArray   avgt   15   90.324 ? 1.398  ns/op
-BigDecimals.testConstructorWithCharArray       avgt   15   48.392 ? 1.284  ns/op
-BigDecimals.testConstructorWithSmallString     avgt   15   19.598 ? 0.084  ns/op
-BigDecimals.testConstructorWithLargeString     avgt   15  124.449 ? 6.672  ns/op
-BigDecimals.testConstructorWithHugeString      avgt   15  130.646 ? 3.427  ns/op
-BigDecimals.testConstructorWithString          avgt   15   68.975 ? 2.721  ns/op

+Benchmark                                      Mode  Cnt    Score   Error  Units (v08 #8b2a762c)
+BigDecimals.testConstructorWithSmallCharArray  avgt   15   17.446 ? 0.054  ns/op -5.73%
+BigDecimals.testConstructorWithLargeCharArray  avgt   15   71.501 ? 0.684  ns/op +26.52%
+BigDecimals.testConstructorWithHugeString      avgt   15   63.814 ? 0.243  ns/op +41.54%
+BigDecimals.testConstructorWithCharArray       avgt   15   41.408 ? 0.830  ns/op +16.86%
+BigDecimals.testConstructorWithSmallString     avgt   15   16.668 ? 0.527  ns/op +17.57%
+BigDecimals.testConstructorWithLargeString     avgt   15   64.055 ? 0.183  ns/op +94.28%
+BigDecimals.testConstructorWithHugeCharArray   avgt   15   70.691 ? 0.682  ns/op +84.81%
+BigDecimals.testConstructorWithString          avgt   15   35.946 ? 0.291  ns/op +91.88%

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

PR Comment: https://git.openjdk.org/jdk/pull/18177#issuecomment-1991601242


More information about the core-libs-dev mailing list