Hi Jochen,

    The changed example will run faster than the original one because cache 
will always be hit for each argument. Actually we can make run even much 
faster, loop more than 100_000 times,  e.g. 1_000_000, because the optimize 
threshold reaches, the related MH will be linked to the cs.

      As you said, we should test it and not just guess ;-)

      BTW, the stack trace is copied from the JIRA issue.

Cheers,
Daniel.Sun

On 2020/01/13 09:17:29 Jochen Theodorou wrote:
> 
> 
> Am 10.01.20 um 16:14 schrieb Daniel.Sun:
> > Hi Jochen,
> >
> >      > If you want to get the maximum performance then I would suggest to
> > work
> > with the guards instead of falling back to a hashed map.
> >
> >      Thanks for your suggestions :-)
> >
> >      After we constructed the following "tree" MH with guards, we have to 
> > set
> > target to link the MH to the related callsite.
> >>
> >>        Guard(String)
> >>        /          \
> >> MH(same(String)    Guard(Float)
> >>                     /          \
> >>         MH(same(float))      Guard(Integer)
> >>                              /           \
> >>                  MH(same(int))        Fallback to select
> >
> >
> >      But the "setTarget" may cause poor performance because JVM may do some
> > de-opt shown as GROOVY-8298:
> 
> nothing goes beyond a test. Really, to be deopt, there has to be an
> optimization first. The tests we did do not reflect this. You have to
> change the examples to something like:
> 
> > def same(String obj) { return obj }
> > def same(int obj) { return obj }
> > def same(float obj) { return obj }
> > for (r in [1, 1.0f, '1.0']) {
> >   for (int i = 0; i < 100_000; i++) {
> >     r.each { same(it) }
> >   }
> > }
> 
> 
> > ```
> > "qtp2078714399-360525": running, holding [771bcf60]
> >     at java.lang.invoke.MethodHandleNatives.setCallSiteTargetNormal(Native
> > Method)
> >     at java.lang.invoke.CallSite.setTargetNormal(CallSite.java:258)
> >     at java.lang.invoke.MutableCallSite.setTarget(MutableCallSite.java:154)
> >     at
> > org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.doCallSiteTargetSet(Selector.java:909)
> >     at
> > org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.setCallSiteTarget(Selector.java:969)
> >     at
> > org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:228)
> >     at
> > java.lang.invoke.LambdaForm$DMH/1665404403.invokeStatic_L3IL5_L(LambdaForm$DMH)
> >     at java.lang.invoke.LambdaForm$BMH/1828868503.reinvoke(LambdaForm$BMH)
> >     at
> > java.lang.invoke.LambdaForm$reinvoker/1917025677.dontInline(LambdaForm$reinvoker)
> >     at java.lang.invoke.LambdaForm$MH/462773420.guard(LambdaForm$MH)
> >     at 
> > java.lang.invoke.LambdaForm$MH/1947020920.linkToCallSite(LambdaForm$MH)
> > ```
> 
> How did you produce that trace?
> 
> bye Jochen
> 
> 

Reply via email to