> 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
David Schlosnagle has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 11 additional commits since the last revision: - Merge remote-tracking branch 'origin/master' into ds/StackTraceElement - Mark StackTraceElement SerialTest for bug 8291641 - Revert "Mark StackTraceElement SerialTest for bug 8291641" This reverts commit e7b04faafb026e61829c81c75121e2d3be6644d9. - Mark StackTraceElement SerialTest for bug 8291641 - Inline max Integer.stringSize - Estimate length - Address comments - Precompute StackTraceElement toString length - Merge remote-tracking branch 'origin/master' into ds/StackTraceElement - Optimize StackTraceElement.toString() - ... and 1 more: https://git.openjdk.org/jdk/compare/ba1acce5...c9ae3897 ------------- Changes: - all: https://git.openjdk.org/jdk/pull/9665/files - new: https://git.openjdk.org/jdk/pull/9665/files/c93ac5af..c9ae3897 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=9665&range=06 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=9665&range=05-06 Stats: 7078 lines in 345 files changed: 4410 ins; 1722 del; 946 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