On Wed, 28 Jun 2023 07:57:25 GMT, Tingjun Yuan <d...@openjdk.org> wrote:

>> This PR changes the implementation of `Long.toUnsignedString(long, int)` for 
>> "default" radices, which avoids creating a `BigInteger` and makes use of 
>> `Long.divideUnsigned` and `Long.remainderUnsigned`.
>> 
>> I've run the test on `test/jdk/java/lang/Long/Unsigned.java` and it works 
>> correctly. I believe that there is no need to add more test cases.
>> 
>> I've added a benchmark case to 
>> `test/micro/org/openjdk/bench/java/lang/Longs.java` for this method. Here is 
>> the benchmark result tested on my machine:
>> 
>> Before (JDK 20.0.1):
>> 
>> 
>> Benchmark                       (size)  Mode  Cnt     Score    Error  Units
>> Longs.toUnsignedStringNegative     500  avgt   15  6428.711 ± 63.142  us/op
>> 
>> 
>> After:
>> 
>> 
>> Benchmark                       (size)  Mode  Cnt     Score     Error  Units
>> Longs.toUnsignedStringNegative     500  avgt   15  3823.655 ± 146.171  us/op
>> 
>> 
>> No CSR needed since the behavior is not changed.
>
> Tingjun Yuan has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Update copyright year

src/java.base/share/classes/java/lang/Long.java line 242:

> 240:                 default -> {
> 241:                     long leadingDigits = divideUnsigned(i, radix);  // 
> always positive
> 242:                     int lastDigit = (int)remainderUnsigned(i, radix);

You can avoid the additional division from `remainderUnsigned()` like so
Suggestion:

                    int lastDigit = (int)(i - leadingDigits * radix);

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14654#discussion_r1434242670

Reply via email to