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 ------------- Commit messages: - speed up j.u.Formatter & String.format Changes: https://git.openjdk.org/jdk/pull/20055/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=20055&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8335791 Stats: 710 lines in 6 files changed: 586 ins; 60 del; 64 mod Patch: https://git.openjdk.org/jdk/pull/20055.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/20055/head:pull/20055 PR: https://git.openjdk.org/jdk/pull/20055