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