On 05.01.26 23:12, Jonny wrote:
Hey, James. I took that repository out for a spin today. I posted my findings at https://github.com/apache/grails-core/issues/15293#issuecomment-3712253386 <https://github.com/apache/grails-core/issues/15293#issuecomment-3712253386>.

In short, the profiler does indicate that most of the time is getting consumed in calls to |java.lang.invoke.Invokers$Holder#linkToCallSite|. That would suggest that there's not much low-hanging fruit to optimize away beyond addressing the problems with InvokeDynamic. It also renders me somewhat skeptical that switching to @CompileStatic would address the root problems in this case.

Apologies that I don't have anything more useful to offer, but I figured I should at least share what I found.

Is this the same as https://github.com/openjdk/jdk/blob/jdk-19%2B0/src/java.base/share/classes/java/lang/invoke/Invokers.java#L579 ?

This only gets the lambda form for what is "target type" in our logs for indy.. of course if that really is depending on the callsite, then we have a ton of different ones. If that is causing a problem we would have to rethink how we compile dynamic Groovy. Then a println("Hello World") should maybe not be compiled as a callsite for (String)Object, but as (Object)Object, well actually as (Object,Object)Object for the implicit this. Except for the usage of primitives (int for example) that would not be a big change. But it means to change the part that writes the callsite invokedynamic instruction.

And of course if this is called also for other cases the change may not have the effect this promises.

As for @CompileStatic. CompileStatic does not use indy where it is fully implemented. Switching would therefore solve the problem where it is implemented and well... where it is not used by Java. But even if used in the same way as Java, we would have a different type of ClassSite object (ConstantCallSite) which would also perform differently.

bye Jochen

Reply via email to