Could you please provide some flame graghs to help us address the performance issue you mentioned.
Cheers, Daniel Sun On 2025/08/07 19:24:29 MG wrote: > Hi .+, > > since Groovy 5 to my knowledge is the first Groovy which does away with > the old, faster, non-invoke-dynamic call site resolution support, I > wanted to do a quick post on that topic that might be of interest to > larger Groovy projects like ours: > > 1. After the initial performance problems in Groovy 3/4 caused > by invoke-dynamic, for which we were, with some effort, in the end > able to pinpoint the culprit in our code and implement a workaround, > we unfortunately discovered another performance drop in a later > Groovy version. > 1. The drop was less severe than in the previous case, but was > around a factor of 2 when it appeared. > 2. In this case we were alas not able to find a specific code part that > caused the drop in performance, but it seemed like Groovy was > leaking a bit of performance on every level, which in the end added > up to our main web application running with half speed in certain > crucial parts, as well as our test suite taking far longer to > execute fully. > 3. After posting about this on the mailing list we initially waited > whether Groovy invoke-dynamic performance would improve, but over > time it became clear that that would most likely not be the case. > 4. Faced with this, we had several options: > 1. Stay on Groovy 4 with non-invoke-dynamic enabled for the > foreseeable future. > 2. Try if switching to statically compiled Groovy (@CompileStatic) > would solve our performance woes. > 3. Switch (at least partially) to a different JVM language. > 5. Since we neither wanted to be locked into Groovy 4 forever (for > obvious reasons), and Groovy is our language of choice (for obvious > reasons ;-) ), the only real option was trying the @CompileStatic route. > 6. Unfortunately we: > 1. Knew from prior experiences that one cannot just > add @CompileStatic to every class in a project and expect the > code to compile / run as expected. > 2. Had decided to switch from @CompileStatic to @TypeChecked a > while ago, to get the benefits of dynamic calls site resolution > (while still having compile time checking). > 7. So, since just auto-applying @CompileStatic to our whole project was > not feasible, we used a more selective approach, where we only > auto-apply @CompileStatic to a single one of our modules at a time. > 1. Simple groovyConfig source to achieve that below (feel free to > include verbatim in your project). > 1. Note: If there is already a > CompileStatic/CompileDynamic/TypeChecked annotation on the > class it will be skipped. > 2. If you want to cook your own and you use your own Groovy macros, > be aware that your Groovy macro module must be excluded in any > case, or you will get some weird, hard to pinpoint build errors! > 8. We started with the lowest of our library modules, working our way > up in the dependency chain. > 1. In our case that was groovyutil (basic shared functionality), > and then groovysql (SQL objects, query building & schema > evolution functionality). > 2. Both modules took a few days each to compile > under @CompileStatic & all tests to be green. > 9. Given the speed at which we progressed, turning our whole > project @CompileStatic would have probably taken a month or so. > 10. Luckily our bottom up approach paid off, and once the groovysql > module was done, performance was indistinguishable > between invoke-dynamic and non-invoke-dynamic builds! :-) > 1. I might do a follow up "tips / lessons learned" post, as time > allows... > 11. Thanks go out to the Groovy dev(s) who are constantly working to > improve @CompileStatic support: Partially switching > to @CompileStatic would definitely have been more hassle a few years > back! G-) > > Cheers, > mg > > > import groovy.transform.CompileDynamic > import groovy.transform.CompileStatic > import groovy.transform.TypeChecked > import org.codehaus.groovy.ast.AnnotationNode > import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer > import org.codehaus.groovy.control.customizers.SourceAwareCustomizer > import org.codehaus.groovy.ast.ClassNode > import java.lang.annotation.Annotation > / > // Enable invoke-dynamic (indy) usage/ > configuration.optimizationOptions.indy = true > / > // Auto @CompileStatic/ > final hasModuleCls = *{ *ClassNode n, List<String> moduleNames *-> > *if(n.packageName === null) { return false } > final packagePathElements = n.packageName.split(/\./) > moduleNames.any *{ *String moduleName *-> > *packagePathElements.contains(moduleName) *} > } > * > final hasAnyAnnotationCls = *{ *ClassNode n, List<Class<Annotation>> > annotations *-> *n.annotations.any *{ *AnnotationNode an *-> > *an.classNode.class in annotations *} } > * > final compileStaticModules = ['groovyutil', 'groovysql'] > final skipModules = ['groovymacro'] > > final autoCompileStatic = new SourceAwareCustomizer(new > ASTTransformationCustomizer(CompileStatic)) > autoCompileStatic.setClassValidator *{ *ClassNode n *-> > *!hasModuleCls(n, skipModules) && hasModuleCls(n, compileStaticModules) > && !hasAnyAnnotationCls(n, [CompileStatic, CompileDynamic, TypeChecked]) *}* > configuration.addCompilationCustomizers(autoCompileStatic) > > > > > Am 06.08.2025 um 12:54 schrieb Paul King: > > Dear community, > > > > The Apache Groovy team is pleased to announce version 5.0.0-rc-1 of > > Apache Groovy. > > Apache Groovy is a multi-faceted programming language for the JVM. > > Further details can be found at thehttps://groovy.apache.org website and in > > the > > Groovy 5 release notes:https://groovy-lang.org/releasenotes/groovy-5.0.html > > > > This is a pre-release of a new version of Groovy. > > We greatly appreciate any feedback you can give us when using this version. > > > > This release includes 9 bug fixes/improvements as outlined in the changelog: > > https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12318123&version=12356146 > > > > Sources, convenience binaries, downloadable documentation and an SDK > > bundle can be found at:https://groovy.apache.org/download.html > > We recommend you verify your installation using the information on that > > page. > > > > Jars are also available within the major binary repositories. > > > > We welcome your help and feedback and in particular want > > to thank everyone who contributed to this release. > > > > For more information on how to report problems, and to get involved, > > visit the project website athttps://groovy.apache.org/ > > > > Best regards, > > > > The Apache Groovy team. >