jamesfredley opened a new pull request, #2393: URL: https://github.com/apache/groovy/pull/2393
## Summary Backport JMH benchmarks for invokedynamic performance patterns and Grails-like workload simulations from master to the GROOVY_4_0_X branch, enabling performance comparison testing on Groovy 4. ## Changes ### New JMH benchmarks (16 files) **Core Groovy performance** (`org.apache.groovy.perf`): - `ClosureBench` - closure creation, reuse, capture, delegation, nesting, currying, composition, trampoline, collection operations - `GStringBench` - GString interpolation, concatenation, lazy evaluation - `GroovyIdiomBench` - Groovy idioms (safe navigation, elvis, spread, with/tap, destructuring) - `LoopsBench` - for/while/each/times/upto loop patterns - `MetaclassBench` - dynamic method dispatch overhead with metaclass changes - `MethodInvocationBench` - method dispatch (instance, static, overloaded, polymorphic, interface, dynamic) - `OperatorBench` - operator overloading, comparisons, range operations - `PropertyAccessBench` - property get/set patterns (direct, dynamic, nested) - `RunnerRegistryBench` - GroovyRunnerRegistry iterator performance **Grails-like patterns** (`org.apache.groovy.perf.grails`): - `CallSiteInvalidationBench` - SwitchPoint invalidation overhead for cross-type and same-type metaclass changes - `CategoryBench` - category usage patterns (single, nested, simultaneous, shadowing) - `DynamicDispatchBench` - methodMissing, propertyMissing, invokeMethod, ExpandoMetaClass injection - `GrailsLikePatternsBench` - composite patterns (service chains, controller actions, domain validation, config DSL, markup builder, full request cycle) - `GrailsWorkloadBench` - collection closure chains, spread operator, nested closure delegation, GString interpolation, project metrics aggregation - `MetaclassChangeBench` - metaclass modification impact (expando additions, replacements, multi-class cascade, burst/steady-state, closure dispatch) - `MetaclassVariationBench` - per-instance ExpandoMetaClass overhead (GORM domain class enhancement pattern) ### Build changes - Updated `org.apache.groovy-performance.gradle` to support `indy` property for toggling invokedynamic mode in JMH compilation (`-Pindy=true|false`, defaults to true) - Added `jmh` task input tracking and `jmhJar` output configuration ### CI workflows - `groovy-jmh.yml` - runs JMH benchmarks with invokedynamic enabled (matrix: bench, core, grails suites) - `groovy-jmh-classic.yml` - runs JMH benchmarks with classic (non-indy) bytecode ### Groovy 4 compatibility adaptation - `DynamicDispatchBench`: moved `DynamicFinder`, `DynamicProperties`, and `MethodInterceptor` from static inner classes to package-level classes because Groovy 4 does not support `methodMissing`/`propertyMissing` on static inner classes ## Verification - Compiled successfully with `./gradlew :performance:jmhClasses` (indy mode) - Compiled successfully with `./gradlew :performance:jmhClasses -Pindy=false` (classic mode) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
