RFR: 8287522: StringConcatFactory: Add in prependers and mixers in batches [v8]

Claes Redestad redestad at openjdk.java.net
Tue Jun 7 08:25:11 UTC 2022


> When generating `MethodHandle`-based concatenation expressions in `StringConcatFactory` we can reduce the number of classes generated at runtime by creating small batches of prependers and mixers before binding them into the root expression tree. 
> 
> Improvements on one-off tests are modest, while the improvement on bootstrapping stress tests can be substantial ([MixedStringCombinations.java](https://gist.github.com/cl4es/08fb581dece3a73e89bfa52337bc4248)):
> 
> | Build      |    # classes    |   Runtime   |
> | ----------- | ----------------- |  --------------- |
> | Baseline |     31119       |     2.942s     |
> | Patch      |     16208       |     1.958s     |
> 
> An earlier version of this patch saw a regression in the `StringConcatFactoryBootstraps` microbenchmark. After some refactoring along with the optimizations in #8881 and #8923 that is no longer the case, and allocation pressure is down slightly compared to the baseline on such a repeat-the-same-bootstrap stress test:
> 
> Baseline:
> 
> Benchmark                                                      Mode  Cnt     Score      Error   Units
> SCFB.makeConcatWithConstants                                   avgt    5  2170.039 ?  117.441   ns/op
> SCFB.makeConcatWithConstants:?gc.alloc.rate.norm               avgt    5  3538.020 ?    4.558    B/op
> 
> This patch:
> 
> Benchmark                                                      Mode  Cnt     Score      Error   Units
> SCFB.makeConcatWithConstants                                   avgt    5  2144.807 ?  162.685   ns/op
> SCFB.makeConcatWithConstants:?gc.alloc.rate.norm               avgt    5  3184.943 ?    4.495    B/op

Claes Redestad 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 17 additional commits since the last revision:

 - Merge branch 'master' into scf_chunked
 - We now don't need big Species classes for shorter concats, so on some tests the improvements meant more Species class generation. Adjusting HelloClasslist
 - Clarify that consts are always reduced to null, even if calling with constants. Also clarify that the number of constants is paramCount + 1 by refactoring to an array
 - Mandy review comment #1: Cleanup LF.basicType a bit more.
 - Cleanup too generic String.valueOf lookups
 - Address review comments from @ExE-Boss
 - Improve bootstrap microbenchmark to include more shapes, reduce runtime
 - Minor stylistic cleanup
 - Revert change to HelloClasslist (doesn't affect generation)
 - Reduce allocation adding in mixers by extracting constant arg lists and caching double arg mixers
 - ... and 7 more: https://git.openjdk.java.net/jdk/compare/98404245...afe61394

-------------

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/8855/files
  - new: https://git.openjdk.java.net/jdk/pull/8855/files/aaa442d5..afe61394

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=8855&range=07
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=8855&range=06-07

  Stats: 59296 lines in 765 files changed: 33676 ins; 19450 del; 6170 mod
  Patch: https://git.openjdk.java.net/jdk/pull/8855.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/8855/head:pull/8855

PR: https://git.openjdk.java.net/jdk/pull/8855


More information about the core-libs-dev mailing list