RFR: 8341470: BigDecimal.stripTrailingZeros() optimization [v12]
Raffaello Giulietti
rgiulietti at openjdk.org
Wed Oct 9 15:49:06 UTC 2024
On Wed, 9 Oct 2024 14:28:53 GMT, fabioromano1 <duke at openjdk.org> wrote:
>> Seems like `BigInteger`s division either takes care of removing common powers of 2 in the dividend and divisor (Knuth division), or removing them has no practical benefit (Burnikel-Ziegler).
>>
>> Thus, I'm wondering if using powers of 10 rather than powers of 5 in the stripping logic could simplify the code while retaining comparable performance.
>>
>> The powers of 10 are already indirectly kept in the class by method `bigTenToThe()` (although they affect resident memory footprint). However, since that method is there to stay and used in other places as well, it might be worthwhile to profit from it.
>
> @rgiulietti
> - About powers of two, there is a difference here: all powers of two are removed, not only the common, to use numbers as small as possible, and the powers are removed all in once, while if not they were removed at each division and also in the divisor, which is a power of 10, slowing the time of every iteration.
> - About `bigTenToThe()`: its shortcoming is that the powers are calculated multiplying by 10 each time, rather than using repeated squares trick, until the cache is completely filled.
>
> These are the main reasons why I decided not to use `bigTenToThe()`.
Oh right, `expandBigIntegerTenPowers()` indeed computes and stores a lot of values.
I'm thinking of opening an issue to rewrite it to just keep the values that are actually computed as intermediate results of a repeated squaring implementation.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21323#discussion_r1793763450
More information about the core-libs-dev
mailing list