JRuby invokedynamic updates

Christian Thalinger christian.thalinger at oracle.com
Fri Aug 12 02:44:53 PDT 2011


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

> 
> - Charlie
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev



More information about the mlvm-dev mailing list