RFR: 8291641: Optimize StackTraceElement.toString()
David Schlosnagle
duke at openjdk.org
Mon Aug 1 17:31:40 UTC 2022
I would like to contribute an optimized version of `StackTraceElement#toString()` that uses a single StringBuilder throughout creation to avoid intermediate `String` allocations. `StackTraceElement#toString()` is used in a number of JDK code paths including `Throwable#printStackTrace()`, as well as many JDK consumers may transform `StackTraceElement` `toString()` in logging frameworks capturing throwables and exceptions, and diagnostics performing dumps.
Given this usage and some observed JFR profiles from production services, I'd like to reduce the intermediate allocations to reduce CPU pressure in these circumstances. I have added a couple benchmarks for a sample `Throwable#printStackTrace()` converted to String via `StringWriter` and individual `StackTraceElement` `toString`. The former shows ~15% improvement, while the latter shows ~40% improvement.
Before
Benchmark Mode Cnt Score Error Units
StackTraceElementBench.printStackTrace avgt 15 167147.066 ± 4260.521 ns/op
StackTraceElementBench.toString avgt 15 132.781 ± 2.095 ns/op
After
Benchmark Mode Cnt Score Error Units
StackTraceElementBench.printStackTrace avgt 15 142909.133 ± 2290.720 ns/op
StackTraceElementBench.toString avgt 15 78.939 ± 0.469 ns/op
-------------
Commit messages:
- Precompute StackTraceElement toString length
- Merge remote-tracking branch 'origin/master' into ds/StackTraceElement
- Optimize StackTraceElement.toString()
- Add StackTraceElementBench
Changes: https://git.openjdk.org/jdk/pull/9665/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9665&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8291641
Stats: 154 lines in 2 files changed: 139 ins; 5 del; 10 mod
Patch: https://git.openjdk.org/jdk/pull/9665.diff
Fetch: git fetch https://git.openjdk.org/jdk pull/9665/head:pull/9665
PR: https://git.openjdk.org/jdk/pull/9665
More information about the core-libs-dev
mailing list