I find the idea very interesting.

I think what happens is that if you invalidate with the switchpoint, then you have first the call to the switchpoint, then you have the call to from cache, which will replace the handle for the callsite. In this new mechanism we skip the first half of the call and directly replace with from cache to then again replace with whatever from cache chose.

The big difference is that the switchpoint is a lazy mechanism, while this new one is an pro-active mechanism. So... if we have a system with a lot of stale callsites that are never going to be visited, well, we pay going through that array and that's it. I think that is a negligible cost. So I am all good with this so far!

bye Jochen

On 30.01.26 06:49, James Fredley wrote:
This PR has been updated and significantly simplified while producing nearly identical results in the Grails test application.

James Fredley

On 1/28/2026 6:16 PM, James Fredley wrote:
I have submitted a draft PR which significantly improves invokedynamic performance in Grails 7 with Groovy 4, while passing the tests in the Groovy build.

Optimizing Indy performance is well outside my expertise, but I'm hopeful this PR will help pave the way for better optimizations for Groovy-based applications like Grails, where frequent metaclass modifications currently invalidate all call sites leading to slower execution.

https://github.com/apache/groovy/pull/2374

James Fredley


Reply via email to