On Sat, 6 Jul 2024 00:15:04 GMT, Shaojin Wen <d...@openjdk.org> wrote:
>> String.format is widely used, and improving its performance is very >> meaningful. This PR can significantly improve the performance of >> String.format. Sorry, there are many changes, which will take a lot of time. >> I hope you can review it patiently. >> >> >> Improved performance includes the following: >> >> ## 1. Write directly during the parse process to reduce object allocation. >> >> In the current Formatter implementation, some objects do not need to be >> allocated, such as: >> >> >> class Formatter { >> public Formatter format(Locale l, String format, Object ... args) { >> List<FormatString> fsa = parse(format); >> // ... >> } >> >> static List<FormatString> parse(String s) { >> ArrayList<FormatString> al = new ArrayList<>(); >> >> while (i < max) { >> int n = s.indexOf('%', i); >> if (n < 0) { >> // >> al.add(new FixedString(s, i, max)); >> } >> } >> } >> } >> >> In the process of parsing, the content that is not a Specifier is directly >> appended without going through FixedString. By directly printing the parsed >> FormatString object, there is no need to construct a `List<FormatString> >> fsa` to store it. >> >> ## 2. Fast path print >> Use specialized FormatString implementations for single-character and >> single-width specifiers to avoid calling the large FormatSpecifier#print >> method. >> >> ## 3. String.format directly calls j.u.Formatter >> String.format directly calls j.u.Formatter via SharedSecrets to improve >> performance > > Shaojin Wen has updated the pull request incrementally with one additional > commit since the last revision: > > Implementing JavaUtilFormatterAccess using anonymous class Re-designing the formatting implementation should wait for the re-emergence of the templates project and implementation. It has similar performance goals and it would be beneficial to have a single implementation of the lower levels to avoid code duplication and take advantage of the optimizations. ------------- PR Comment: https://git.openjdk.org/jdk/pull/20055#issuecomment-2243122522