-
Enhancement
-
Resolution: Unresolved
-
P4
-
None
-
None
-
None
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
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
- links to
-
Review(master) openjdk/jdk/20055