JRuby invokedynamic updates
Rémi Forax
forax at univ-mlv.fr
Fri Aug 12 10:36:38 PDT 2011
Hi Chistian,
On 08/12/2011 11:44 AM, Christian Thalinger wrote:
> On Aug 11, 2011, at 11:07 PM, Charles Oliver Nutter wrote:
>
>> On Wed, Aug 10, 2011 at 11:02 PM, Charles Oliver Nutter
>> <headius at headius.com> wrote:
>>> I've added bench/bench_fib_complex.rb. This runs the original fib
>>> along with three variations:
>>>
>>> * One that uses constants for the literals 1 and 2 in the code
>>> * One that dispatches to other Ruby methods for the<, -, and + calls
>>> * One that does both
>>>
>>> Performance is perhaps most easily explained by showing the numbers:
>> After talking with Christian I realized that the constant-based
>> versions were not getting fully bound with invokedynamic because they
>> have pre/post logic (specifically, they need to update some
>> thread-local frame state in JRuby). Ignore those results for the
>> moment.
>>
>> There does still seem to be a problem with switchpoints though. I
>> stripped out all but the "additional calls" version and compared
>> switchpoint invalidation with normal.
>>
>>
>> headius at headius-desktop:~/projects/jruby$
>> JAVA_HOME=~/hsx-hotspot/build/linux/jdk-linux-i586/ bin/jruby --server
>> bench/bench_fib_complex.rb 5 35
>> fib with additional calls
>> 9227465
>> 2.180000 0.000000 2.180000 ( 2.070000)
>> fib with additional calls
>> 9227465
>> 1.829000 0.000000 1.829000 ( 1.829000)
>> fib with additional calls
>> 9227465
>> 1.870000 0.000000 1.870000 ( 1.870000)
>> fib with additional calls
>> 9227465
>> 1.642000 0.000000 1.642000 ( 1.642000)
>> fib with additional calls
>> 9227465
>> 1.639000 0.000000 1.639000 ( 1.639000)
>>
>> headius at headius-desktop:~/projects/jruby$
>> JAVA_HOME=~/hsx-hotspot/build/linux/jdk-linux-i586/ bin/jruby --server
>> -Xinvokedynamic.invocation.switchpoint=true bench/bench_fib_complex.rb
>> 5 35
>> fib with additional calls
>> 9227465
>> 5.951000 0.000000 5.951000 ( 5.841000)
>> fib with additional calls
>> 9227465
>> 5.538000 0.000000 5.538000 ( 5.538000)
>> fib with additional calls
>> 9227465
>> 5.531000 0.000000 5.531000 ( 5.531000)
>> fib with additional calls
>> 9227465
>> 5.503000 0.000000 5.503000 ( 5.503000)
>> fib with additional calls
>> 9227465
>> 5.505000 0.000000 5.505000 ( 5.505000)
>>
>> My quick look through inlining shows that "plus", "minus", "lt" all
>> inline into fib_ruby3 ok, as do the binops they call. fib_ruby3
>> appears to recursively inline one level. I did not see any obvious
>> failures in inlining, but there's something not right here.
> Well, it's the good old:
>
> @ 95 java.lang.invoke.MethodHandle::invokeExact (45 bytes) size> DesiredMethodLimit
>
> This seems to be the last recursive call that doesn't get inlined. Setting MaxRecursiveInlineLevel=0 makes it go faster. I finally filed (a separate bug to keep this a single change):
>
> 7078382: JSR 292: don't count method handle adapters against inlining budgets
>
> The proposed fix is:
>
> http://cr.openjdk.java.net/~twisti/7078382/
>
> The numbers are now like they should be:
>
> intelsdv07:~/mlvm/jruby$ jruby --server bench/bench_fib_complex.rb 5 35
> fib with additional calls
> 0.865000 0.000000 0.865000 ( 0.835000)
> 0.745000 0.000000 0.745000 ( 0.745000)
> 0.750000 0.000000 0.750000 ( 0.750000)
> 0.742000 0.000000 0.742000 ( 0.742000)
> 0.743000 0.000000 0.743000 ( 0.744000)
>
> intelsdv07:~/mlvm/jruby$ jruby --server -Xinvokedynamic.invocation.switchpoint=true bench/bench_fib_complex.rb 5 35
> fib with additional calls
> 0.789000 0.000000 0.789000 ( 0.759000)
> 0.661000 0.000000 0.661000 ( 0.661000)
> 0.659000 0.000000 0.659000 ( 0.660000)
> 0.661000 0.000000 0.661000 ( 0.661000)
> 0.661000 0.000000 0.661000 ( 0.661000)
>
> -- Christian
I wonder if this patch is not too much.
If a big method is called through an invokedynamic + method handle
then it will be inlined.
I wonder if it's not better to crawle the method handle tree and
sum up the bytecode size of all method that have a bytecode size
(all the ones that aren't in j.l.invoke).
Rémi
More information about the mlvm-dev
mailing list