RFR: 8366224: Introduce DecimalDigits.appendPair for efficient two-digit formatting and refactor DateTimeHelper

Shaojin Wen swen at openjdk.org
Thu Aug 28 01:57:49 UTC 2025


On Wed, 27 Aug 2025 17:57:31 GMT, Roger Riggs <rriggs at openjdk.org> wrote:

>> This PR introduces a new efficient API for appending two-digit integers to StringBuilders and refactors DateTimeHelper to leverage this new functionality.
>> 
>> Changes include:
>> 
>> 1. New `appendPair` method for efficient two-digit integer formatting (00-99):
>>    - Added `AbstractStringBuilder.appendPair(int i)` with core implementation
>>    - Added `JavaLangAccess.appendPair(StringBuilder, int)` for internal access
>>    - Added `System.JavaLangAccessImpl.appendPair(StringBuilder, int)` bridge
>>    - Added `DecimalDigits.appendPair(StringBuilder, int)` public static utility method
>>    - Enhanced Javadoc documentation for all new methods
>> 
>> 2. Refactored `DateTimeHelper` to use the new `DecimalDigits.appendPair`:
>>    - Updated `DateTimeHelper.formatTo` methods for `LocalDate` and `LocalTime`
>>    - Replaced manual formatting logic with the new efficient two-digit appending
>>    - Improved code clarity and consistency in date/time formatting
>> 
>> These changes improve code clarity and performance when formatting two-digit numbers, particularly in date/time formatting scenarios.
>
> Generally, even with the performance benefits, this code is too narrow a use case to justify the hacking into AbstractStringBuilder and adding another package busting JavaLangAccess entry point.

Thank you for your feedback, @RogerRiggs.

I introduced this PR because I plan to optimize the performance of `java.time.format.DateTimeFormatter`'s `parse` and `format` methods. This is a very large change, and to facilitate code review, I am splitting the process into multiple smaller PRs. This allows us to achieve continuous improvement, and this PR is one part of that effort.

In future optimizations, I need to use `AbstractStringBuilder.appendPair` when writing values like Year/Month/DayOfMonth/Hour/Minute/Second within the `java.time.format.DateTimeFormatterBuilder$NumberPrinterParser#format` method.

In the current PR, using `appendPair` in `DateTimeHelper` to write month/dayOfMonth/hour/minute/second results in code that is more intuitive than the original.

*   Original


month = date.getMonthValue(),
day   = date.getDayOfMonth();

buf.append(month < 10 ? "-0" : "-").append(month)
   .append(day < 10 ? "-0" : "-").append(day);


*   Improved


buf.append('-');
DecimalDigits.appendPair(buf, date.getMonthValue());
buf.append('-');
DecimalDigits.appendPair(buf, date.getDayOfMonth());


The improved code is more readable than the original.

Placing `appendPair` in `DecimalDigits` alongside other `putPair` series methods also makes the code's purpose easier to understand.

`AbstractStringBuilder.appendPair` was introduced for the `java.time` format scenario, but it can also be used in `java.util.Formatter` in the future, or potentially with `StringTemplate` if it's introduced. My latest commit adds more usage scenarios in `core-libs`.

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

PR Comment: https://git.openjdk.org/jdk/pull/26911#issuecomment-3231113907


More information about the security-dev mailing list