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