where are our performance bottlenecks?

Tom Rodriguez tom.rodriguez at oracle.com
Wed Jul 6 13:49:19 PDT 2011


On Jul 6, 2011, at 4:18 AM, Christian Thalinger wrote:

> 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)

I would think we don't want this inlined since it's the fallback path.  Try -XX:CompileCommand=dontinline,*,invocationFallback.  Inlining it may cause us to run up against other limits like the NodeInliningCutoff and DesiredMethodLimit.

tom

>                                  @ 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
> 
> 
> _______________________________________________
> 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