Hi,

StringConcatFactory$MethodHandleInlineCopyStrategy was made the default
strategy in 9+120, which brought with it a number of startup
regressions due to heavy use of MethodHandles when running the
bootstrap method for each String concatenation. In exchange it allows
for better peak performance, so it's been argued that we're striking a
good trade-off already.

However, after some analysis it appears we could collapse a few
transformations where we were padding out combinators with dummy
arguments as a mean to select an argument from the parameter list
(which can also avoid the need to permute arguments in some cases). By
introducing a method on j.l.invoke.MethodHandles to do this we can
simplify the MethodHandleInlineCopyStrategy and produce on average 25%
fewer LFs.

By further folding the CHECK_INDEX into the newString method we avoid
a few additional LF shapes from being created early on, while proving
performance neutral on micros.

Bug: https://bugs.openjdk.java.net/browse/JDK-8165492

Webrev: http://cr.openjdk.java.net/~redestad/8165492/webrev.01/

Testing: RBT, no regressions observed on microbenchmarks[1], while
recuperating ~25-30% of the largest startup regressions introduced in
9+120

It's not the intent of this change to make this new foldArguments a
part of the public API, since it's simply too late for 9. Instead we'd
like to defer the discussion of possibly including this in the public
API until a later time, which also gives us ample opportunity to
examine other options - such as being better at not fully generating
intermediary LFs.

Thanks!

/Claes

Reply via email to