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

Reply via email to