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