RFR: 8165492: Reduce number of lambda forms generated by MethodHandleInlineCopyStrategy

Paul Sandoz paul.sandoz at oracle.com
Thu Sep 8 18:21:35 UTC 2016


Quick observation before diving in further.

IIUC you are essentially adding a dummy index parameter to StringConcatHelper.newString, which should always be zero, and that helps compress LFs for the MH combinator:

 341     static String newString(byte[] buf, int index, byte coder) {
 342         // Use the private, non-copying constructor (unsafe!)
 343         if (index != 0) {
 344             throw new IllegalStateException("Storage is not completely initialized, " + index + " bytes left");
 345         }
 346         return new String(buf, coder);
 347     }

Did you consider replacing the if block with an assert? presumably if it is non-zero it is an internal error?


> On 8 Sep 2016, at 10:03, Claes Redestad <claes.redestad at oracle.com> wrote:
> 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

More information about the core-libs-dev mailing list