On Wed, 1 Jun 2022 13:03:38 GMT, Claes Redestad <redes...@openjdk.org> wrote:
>> 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 incrementally with one additional > commit since the last revision: > > Improve bootstrap microbenchmark to include more shapes, reduce runtime src/java.base/share/classes/java/lang/invoke/StringConcatFactory.java line 674: > 672: 1 + pos, 2 + pos, 3 + pos, 4 + pos // selected > arguments > 673: ); > 674: } This should probably also use a switch like the above: Suggestion: return switch (count) { case 1 -> MethodHandles.foldArgumentsWithCombiner(mh, 0, mix, 1 + pos // selected arguments ); case 2 -> MethodHandles.foldArgumentsWithCombiner(mh, 0, mix, 1 + pos, 2 + pos // selected arguments ); case 3 -> MethodHandles.foldArgumentsWithCombiner(mh, 0, mix, 1 + pos, 2 + pos, 3 + pos // selected arguments ); case 4 -> MethodHandles.foldArgumentsWithCombiner(mh, 0, mix, 1 + pos, 2 + pos, 3 + pos, 4 + pos // selected arguments ); default -> throw new AssertionError(count); } ------------- PR: https://git.openjdk.java.net/jdk/pull/8855