RFR: 8260710: Inline and simplify String*::{coder, value, isLatin1} methods
Aleksey Shipilev
shade at openjdk.java.net
Tue Feb 9 12:50:40 UTC 2021
Since Compact Strings implementation, there are simple methods in String and StringBuilders: `coder()`, `value()`, `isLatin1()`. They are mostly there to capture `COMPACT_STRINGS` flag that would fold to "false" when compact strings are disabled with `-XX:-CompactStrings`.
This was to guarantee the same performance when Compact String are unimplemented and/or have surprising performance behaviors. Quite some time had passed since JDK 9 release, and we can consider simplifying these. For example, ignoring `COMPACT_STRINGS` and inlining the methods simplifies the code. Some new code added to `String` after JDK 9 already has these methods inlined, checking `coder` directly.
The major drawback is that supplying `-XX:-CompactStrings` would have to go through the same `coder == UTF16` paths the "normal" Compact Strings are going. It would not be folded to the most optimal form by the optimizer, because `coder` field value is generally opaque to optimizers.
On the flip side, there is an advantage on paths that do not have optimizer ready (yet), for example at startup. Hello World startup improves for about 0.3 msec (or ~1.3%). The improvement is quite probably more visible on larger workloads, i.e. large application servers. (In fact, this is where I spotted this opportunity: OpenLiberty startup profiles).
Interpreter-only "Hello World":
Performance counter stats for 'taskset -c 13 build/baseline/bin/java -Xms128m -Xmx128m -Xint Hello' (5000 runs):
23.40 msec task-clock # 0.933 CPUs utilized ( +- 0.01% )
86,133,190 cycles # 3.680 GHz ( +- 0.01% )
79,854,588 instructions # 0.93 insn per cycle ( +- 0.00% )
0.02507105 +- 0.00000343 seconds time elapsed ( +- 0.01% )
Performance counter stats for 'taskset -c 13 build/linux-x86_64-server-release/images/jdk/bin/java -Xms128m -Xmx128m -Xint Hello' (5000 runs):
23.07 msec task-clock # 0.935 CPUs utilized ( +- 0.01% )
84,877,118 cycles # 3.679 GHz ( +- 0.01% )
79,231,598 instructions # 0.93 insn per cycle ( +- 0.00% )
0.02466467 +- 0.00000382 seconds time elapsed ( +- 0.02% )
OpenLiberty startup:
Before: 2.296, 2.281, 2.291 (seconds)
After: 2.254, 2.267, 2.272 (seconds)
Additional tests:
- [x] Linux `tier1` default (passes)
- [x] Linux `tier1` `-XX:-CompactStrings`
-------------
Commit messages:
- Merge branch 'master' into JDK-8260710-string-inline
- Merge branch 'master' into JDK-8260710-string-inline
- Initial prototype
Changes: https://git.openjdk.java.net/jdk/pull/2334/files
Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2334&range=00
Issue: https://bugs.openjdk.java.net/browse/JDK-8260710
Stats: 173 lines in 5 files changed: 5 ins; 48 del; 120 mod
Patch: https://git.openjdk.java.net/jdk/pull/2334.diff
Fetch: git fetch https://git.openjdk.java.net/jdk pull/2334/head:pull/2334
PR: https://git.openjdk.java.net/jdk/pull/2334
More information about the core-libs-dev
mailing list