> I analyzed the performance of Thread.setName() in response to a customer > workload running Cassandra, where Thread.setName() showed up (mostly because > of rather pathetic use of setName() from Cassanda *sigh*). > > Profiling showed that most time (around 75%) is spent in the actual syscall, > so there are limits on what we can do. > > I implemented the following improvements: > - Almost all thread names are Latin1/ASCII, and there is no need to convert > to UTF8 in that case. Also, the various OS APIs to set the thread name don't > even seem to specify the character encoding. Avoiding the UTF8 conversion (if > possible) brings down the length-dependent costs. In many cases we can also > pass down the backing array of the string and avoid copying altogether. > - For truncating the name on Linux to 16 chars, instead of using snprintf > with a pattern, we can simply stitch together the name directly (first 7 > chars, last 6 chars, 2 dots in between), this saves ~100ns. > > In the end, we bring down performance for the small cases by ~7%, longer > names by ~20% and completely removed the conversion overhead that primarily > affected longer names. > > | Benchmark | (length) | Baseline (ns/op) | Optimized (ns/op) | Change > | > > |---------------|----------|------------------:|-------------------:|--------:| > | setName | 1 | 602.3 ± 2.0 | 561.9 ± 1.5 | > -6.7% | > | setName | 4 | 605.9 ± 2.1 | 570.2 ± 1.2 | > -5.9% | > | setName | 15 | 617.1 ± 2.7 | 570.4 ± 2.8 | > -7.6% | > | setName | 16 | 712.1 ± 6.0 | 569.4 ± 2.7 | > -20.0% | > | setName | 50 | 757.9 ± 5.2 | 566.3 ± 4.6 | > -25.3% | > | setName | 200 | 986.2 ± 2.7 | 569.9 ± 4.9 | > -42.2% | > | setNameSame | 1 | — | 7.4 ± 0.0 | — > | > | setNameSame | 4 | — | 7.4 ± 0.0 | — > | > | setNameSame | 15 | — | 7.4 ± 0.0 | — > | > | setNameSame | 16 | — | 7.4 ± 0.0 | — > | > | setNameSame | 50 | — | 7.4 ± 0.0 | — > | > | setNameSame | 200 | — | 7.4 ± 0.0 | — > | > > > Testing: > - [x] tier1 > - [ ] tier2 > > The failing GHA test in langtools seems unrelated.
Roman Kennke has updated the pull request incrementally with one additional commit since the last revision: Improve BSD and Windows impls ------------- Changes: - all: https://git.openjdk.org/jdk/pull/30374/files - new: https://git.openjdk.org/jdk/pull/30374/files/4d6cae8f..a3e22992 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=30374&range=04 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=30374&range=03-04 Stats: 8 lines in 2 files changed: 2 ins; 0 del; 6 mod Patch: https://git.openjdk.org/jdk/pull/30374.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/30374/head:pull/30374 PR: https://git.openjdk.org/jdk/pull/30374
