where are our performance bottlenecks?

Christian Thalinger christian.thalinger at oracle.com
Wed Jul 6 04:18:33 PDT 2011


On Jul 5, 2011, at 6:39 PM, Charles Oliver Nutter wrote:
> I'm not in position at this exact moment to report perf issues, but
> Rémi's list would be a good start. I'll return to JRuby benchmarks and
> start looking for specific bottlenecks.

OK.

> 
> As reported in some of my my previous emails, JRuby has several uses
> of indy that are off by default, so it will be nice to start getting
> them enabled.

When I use -Xinvokedynamic.all=true with bench_string_ops.rb I get:

InvokeDynamicSupport.java:710:in `fixnum_op_mul': java.lang.ClassCastException: org.jruby.RubyString cannot be cast to org.jruby.RubyFixnum

I just saw a benchmark I haven't seen before:  bench_avi_base64.rb

Performance with indy is not very good:

intelsdv07:~/mlvm/jruby$ jruby --server -Xcompile.invokedynamic=false bench/bench_avi_base64.rb 
  1.569000   0.000000   1.569000 (  1.539000)
  0.895000   0.000000   0.895000 (  0.895000)
  0.850000   0.000000   0.850000 (  0.850000)
  0.848000   0.000000   0.848000 (  0.848000)
  0.848000   0.000000   0.848000 (  0.848000)

intelsdv07:~/mlvm/jruby$ jruby --server bench/bench_avi_base64.rb 
  2.335000   0.000000   2.335000 (  2.305000)
  1.503000   0.000000   1.503000 (  1.503000)
  1.470000   0.000000   1.470000 (  1.470000)
  1.479000   0.000000   1.479000 (  1.479000)
  1.470000   0.000000   1.470000 (  1.470000)

The pattern I always see when I look at the inlining tree of a badly performing benchmark is this one:

                                @ 9   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::invocationFallback (197 bytes)   inline (hot)
                                  @ 2   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::pollAndGetClass (13 bytes)   inline (hot)
                                    @ 1   org.jruby.runtime.ThreadContext::callThreadPoll (23 bytes)   inline (hot)
                                      @ 19   org.jruby.runtime.ThreadContext::pollThreadEvents (9 bytes)   inline (hot)
                                        @ 5   org.jruby.RubyThread::pollThreadEvents (13 bytes)   inline (hot)
                                  @ 11   org.jruby.RubyModule::searchWithCache (68 bytes)   already compiled into a medium method
                                  @ 19   org.jruby.runtime.invokedynamic.JRubyCallSite::callType (5 bytes)   inline (hot)
                                  @ 25   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::methodMissing (47 bytes)   too big
                                  @ 34   org.jruby.runtime.invokedynamic.JRubyCallSite::callType (5 bytes)   inline (hot)
                                  @ 43   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::callMethodMissing (34 bytes)   never executed
               !                  @ 55   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::getTarget (169 bytes)   too big
                                  @ 109   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::postProcess (315 bytes)   too big
                                  @ 115   java.lang.invoke.MutableCallSite::getTarget (5 bytes)   inline (hot)
                                  @ 128   java.lang.invoke.MutableCallSite::getTarget (5 bytes)   inline (hot)
                                  @ 135   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::createGWT (59 bytes)   too big
                                  @ 138   java.lang.invoke.MutableCallSite::setTarget (15 bytes)   executed < MinInliningThreshold times
                                  @ 156   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::createGWT (11 bytes)   never executed
                                  @ 159   java.lang.invoke.MutableCallSite::setTarget (15 bytes)   executed < MinInliningThreshold times
                                  @ 94   org.jruby.runtime.invokedynamic.InvokeDynamicSupport::createFail (74 bytes)   too big
                                  @ 100   java.lang.invoke.MutableCallSite::setTarget (15 bytes)   executed < MinInliningThreshold times
                                  @ 190   java.lang.invoke.MethodHandle::invokeWithArguments (61 bytes)   too big

I remember we were talking about the createGWT.  Can this go away?

-- Christian

> 
> On Tue, Jul 5, 2011 at 9:04 AM, Christian Thalinger
> <christian.thalinger at oracle.com> wrote:
>> Now that we are done with 7 I'm looking into performance issues we have.  Are there any that you know of and would like to get fixed for 7u2?
>> 
>> -- Christian
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev at openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>> 
> _______________________________________________
> 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