RFR: 8291641: Optimize StackTraceElement.toString() [v7]
Max Mielchen
duke at openjdk.org
Mon Aug 8 19:00:54 UTC 2022
On Sat, 6 Aug 2022 14:55:17 GMT, David Schlosnagle <duke at openjdk.org> wrote:
>> 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/ea20ba0f...c9ae3897
Marked as reviewed by maxmielchen at github.com (no known OpenJDK username).
-------------
PR: https://git.openjdk.org/jdk/pull/9665
More information about the core-libs-dev
mailing list