[ https://issues.apache.org/jira/browse/GROOVY-10307 ]


    Paul King deleted comment on GROOVY-10307:
    ------------------------------------

was (Author: paulk):
I did further testing. Below is the output followed by ChatGPT's summary of the 
results:
{noformat}
> ./gradlew perf:jmh
Benchmark (indy=true default, PR#2377=true)                                     
            (n)   Mode  Cnt      Score       Error   Units
o.a.g.bench.GeneratedHashCodeBench.generated_hashcode_on_instance_with_null_properties
      N/A  thrpt   10  99536.849 ± 29751.503  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovy                
            N/A  thrpt   10   6653.645 ±  1455.886  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovyCS              
            N/A  thrpt   10  29983.607 ±    85.754  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_java                  
            N/A  thrpt   10   7867.381 ±    31.122  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovy                
            N/A  thrpt   10    933.345 ±    20.268  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovyCS              
            N/A  thrpt   10  26568.938 ±  1107.974  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_java                  
            N/A  thrpt   10   8416.360 ±   419.788  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovy                
            N/A  thrpt   10    849.872 ±     8.306  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovyCS              
            N/A  thrpt   10  25772.555 ±   362.573  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_java                  
            N/A  thrpt   10   7559.619 ±   323.515  ops/ms
o.a.g.bench.AckermannBench.groovy                                               
              5   avgt   10      0.203 ±     0.008   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              6   avgt   10      0.868 ±     0.014   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              7   avgt   10      3.959 ±     0.122   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              8   avgt   10     16.742 ±     0.615   ms/op
o.a.g.bench.AckermannBench.java                                                 
              5   avgt   10      0.047 ±     0.001   ms/op
o.a.g.bench.AckermannBench.java                                                 
              6   avgt   10      0.235 ±     0.001   ms/op
o.a.g.bench.AckermannBench.java                                                 
              7   avgt   10      1.035 ±     0.003   ms/op
o.a.g.bench.AckermannBench.java                                                 
              8   avgt   10      4.370 ±     0.220   ms/op
o.a.g.bench.AryBench.groovy                                                     
             10   avgt   10      0.187 ±     0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
            100   avgt   10      1.920 ±     0.067   ms/op
o.a.g.bench.AryBench.groovy                                                     
           1000   avgt   10     21.565 ±     0.914   ms/op
o.a.g.bench.AryBench.groovy                                                     
        1000000   avgt   10  19541.451 ±  2780.222   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
             10   avgt   10      0.004 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
        1000000   avgt   10     84.667 ±     2.193   ms/op
o.a.g.bench.AryBench.java                                                       
             10   avgt   10      0.003 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
        1000000   avgt   10     85.953 ±     4.176   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             30   avgt   10      6.611 ±     0.422   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             31   avgt   10     10.372 ±     0.476   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             32   avgt   10     16.708 ±     0.157   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             33   avgt   10     28.247 ±     2.218   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             34   avgt   10     43.897 ±     2.511   ms/op
o.a.g.bench.FiboBench.java                                                      
             30   avgt   10      1.283 ±     0.027   ms/op
o.a.g.bench.FiboBench.java                                                      
             31   avgt   10      2.093 ±     0.051   ms/op
o.a.g.bench.FiboBench.java                                                      
             32   avgt   10      3.373 ±     0.054   ms/op
o.a.g.bench.FiboBench.java                                                      
             33   avgt   10      6.062 ±     0.968   ms/op
o.a.g.bench.FiboBench.java                                                      
             34   avgt   10      9.734 ±     1.312   ms/op
o.a.g.perf.ClosureBench.closureAsParameter                                      
            N/A   avgt   10     15.244 ±     0.211   ms/op
o.a.g.perf.ClosureBench.closureCallMethod                                       
            N/A   avgt   10      6.766 ±     0.237   ms/op
o.a.g.perf.ClosureBench.closureComposition                                      
            N/A   avgt   10     31.817 ±     0.908   ms/op
o.a.g.perf.ClosureBench.closureDelegation                                       
            N/A   avgt   10     16.879 ±     0.332   ms/op
o.a.g.perf.ClosureBench.closureModifyCapture                                    
            N/A   avgt   10      3.185 ±     0.029   ms/op
o.a.g.perf.ClosureBench.closureMultiParams                                      
            N/A   avgt   10     13.307 ±     0.895   ms/op
o.a.g.perf.ClosureBench.closureReuse                                            
            N/A   avgt   10      6.656 ±     0.043   ms/op
o.a.g.perf.ClosureBench.closureSpread                                           
            N/A   avgt   10    780.831 ±   258.099   ms/op
o.a.g.perf.ClosureBench.closureTrampoline                                       
            N/A   avgt   10     17.366 ±     1.398   ms/op
o.a.g.perf.ClosureBench.closureWithCapture                                      
            N/A   avgt   10      6.971 ±     0.068   ms/op
o.a.g.perf.ClosureBench.collectWithClosure                                      
            N/A   avgt   10     19.155 ±     0.161   ms/op
o.a.g.perf.ClosureBench.curriedClosure                                          
            N/A   avgt   10     40.010 ±     1.150   ms/op
o.a.g.perf.ClosureBench.eachWithClosure                                         
            N/A   avgt   10     19.002 ±     0.280   ms/op
o.a.g.perf.ClosureBench.findAllWithClosure                                      
            N/A   avgt   10     24.846 ±     1.620   ms/op
o.a.g.perf.ClosureBench.injectWithClosure                                       
            N/A   avgt   10     19.971 ±     0.202   ms/op
o.a.g.perf.ClosureBench.methodReference                                         
            N/A   avgt   10     34.515 ±     0.593   ms/op
o.a.g.perf.ClosureBench.nestedClosures                                          
            N/A   avgt   10     18.483 ±     0.673   ms/op
o.a.g.perf.ClosureBench.rightCurriedClosure                                     
            N/A   avgt   10     37.565 ±     2.065   ms/op
o.a.g.perf.ClosureBench.simpleClosureCreation                                   
            N/A   avgt   10     12.477 ±     0.464   ms/op
o.a.g.perf.GStringBench.gstringAsMapKey                                         
            N/A   avgt   10    154.024 ±     7.240   ms/op
o.a.g.perf.GStringBench.multiValueInterpolation                                 
            N/A   avgt   10    127.361 ±     5.759   ms/op
o.a.g.perf.GStringBench.repeatedToString                                        
            N/A   avgt   10      3.224 ±     0.116   ms/op
o.a.g.perf.GStringBench.simpleInterpolation                                     
            N/A   avgt   10     52.284 ±     3.624   ms/op
o.a.g.perf.GStringBench.stringConcatBaseline                                    
            N/A   avgt   10     26.187 ±     1.047   ms/op
o.a.g.perf.GroovyIdiomBench.asListToSet                                         
            N/A   avgt   10     66.305 ±     6.344   ms/op
o.a.g.perf.GroovyIdiomBench.asStringToInteger                                   
            N/A   avgt   10     28.609 ±     0.290   ms/op
o.a.g.perf.GroovyIdiomBench.asToString                                          
            N/A   avgt   10     20.634 ±     0.332   ms/op
o.a.g.perf.GroovyIdiomBench.collectBaseline                                     
            N/A   avgt   10     15.662 ±     0.752   ms/op
o.a.g.perf.GroovyIdiomBench.elvisEmptyString                                    
            N/A   avgt   10      4.916 ±     0.522   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNonNull                                        
            N/A   avgt   10      5.099 ±     0.348   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNull                                           
            N/A   avgt   10      2.473 ±     0.016   ms/op
o.a.g.perf.GroovyIdiomBench.normalNavBaseline                                   
            N/A   avgt   10      3.959 ±     0.023   ms/op
o.a.g.perf.GroovyIdiomBench.rangeContains                                       
            N/A   avgt   10     24.587 ±     0.146   ms/op
o.a.g.perf.GroovyIdiomBench.rangeCreation                                       
            N/A   avgt   10      4.275 ±     0.176   ms/op
o.a.g.perf.GroovyIdiomBench.rangeIteration                                      
            N/A   avgt   10     14.564 ±     0.501   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNonNull                                      
            N/A   avgt   10      6.863 ±     1.380   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNull                                         
            N/A   avgt   10      2.409 ±     0.004   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotMethod                                     
            N/A   avgt   10     19.604 ±     0.397   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotProperty                                   
            N/A   avgt   10     85.831 ±     3.123   ms/op
o.a.g.perf.GroovyIdiomBench.tapScope                                            
            N/A   avgt   10    305.981 ±    22.557   ms/op
o.a.g.perf.GroovyIdiomBench.withScope                                           
            N/A   avgt   10     65.892 ±     0.798   ms/op
o.a.g.perf.LoopsBench.eachIdentity                                              
            N/A   avgt   10     27.923 ±     2.579   ms/op
o.a.g.perf.LoopsBench.methodCallInLoop                                          
            N/A   avgt   10      3.750 ±     0.184   ms/op
o.a.g.perf.LoopsBench.nestedLoopsWithClosure                                    
            N/A   avgt   10     50.694 ±     0.323   ms/op
o.a.g.perf.LoopsBench.originalEachToString                                      
            N/A   avgt   10     31.904 ±     0.965   ms/op
o.a.g.perf.LoopsBench.reusedClosureInLoop                                       
            N/A   avgt   10      3.659 ±     0.043   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkDynamicTypedCalls                     
            N/A   avgt   10      2.784 ±     0.048   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkInterfaceMethodCalls                  
            N/A   avgt   10      2.611 ±     0.181   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithObject                      
            N/A   avgt   10      9.138 ±     0.059   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithParams                      
            N/A   avgt   10      7.063 ±     0.729   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMonomorphicCallSite                   
            N/A   avgt   10     32.387 ±     0.417   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkPolymorphicCallSite                   
            N/A   avgt   10   1281.562 ±    22.680   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkSimpleMethodCalls                     
            N/A   avgt   10      2.649 ±     0.023   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodCalls                     
            N/A   avgt   10      2.391 ±     0.054   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodWithParams                
            N/A   avgt   10      7.175 ±     0.068   ms/op
o.a.g.perf.OperatorBench.bigDecimalArithmetic                                   
            N/A   avgt   10      7.290 ±     0.076   ms/op
o.a.g.perf.OperatorBench.comparisonOperators                                    
            N/A   avgt   10      1.730 ±     0.086   ms/op
o.a.g.perf.OperatorBench.equalsOperator                                         
            N/A   avgt   10      1.686 ±     0.057   ms/op
o.a.g.perf.OperatorBench.inOperator                                             
            N/A   avgt   10     43.383 ±     2.510   ms/op
o.a.g.perf.OperatorBench.integerMultiply                                        
            N/A   avgt   10     12.633 ±     0.724   ms/op
o.a.g.perf.OperatorBench.integerPlus                                            
            N/A   avgt   10      2.352 ±     0.076   ms/op
o.a.g.perf.OperatorBench.listGetAt                                              
            N/A   avgt   10      9.591 ±     0.173   ms/op
o.a.g.perf.OperatorBench.listLeftShift                                          
            N/A   avgt   10     15.480 ±     0.359   ms/op
o.a.g.perf.OperatorBench.listPutAt                                              
            N/A   avgt   10     13.631 ±     0.528   ms/op
o.a.g.perf.OperatorBench.mapGetAtPutAt                                          
            N/A   avgt   10     60.306 ±     2.087   ms/op
o.a.g.perf.OperatorBench.spaceshipOperator                                      
            N/A   avgt   10      6.098 ±     0.081   ms/op
o.a.g.perf.OperatorBench.stringMultiply                                         
            N/A   avgt   10     10.444 ±     0.081   ms/op
o.a.g.perf.OperatorBench.unaryMinus                                             
            N/A   avgt   10      2.607 ±     0.084   ms/op
o.a.g.perf.PropertyAccessBench.chainedPropertyAccess                            
            N/A   avgt   10      7.964 ±     0.102   ms/op
o.a.g.perf.PropertyAccessBench.dynamicTypedPropertyAccess                       
            N/A   avgt   10    113.280 ±     5.712   ms/op
o.a.g.perf.PropertyAccessBench.fieldReadWrite                                   
            N/A   avgt   10      2.571 ±     0.018   ms/op
o.a.g.perf.PropertyAccessBench.getterSetterAccess                               
            N/A   avgt   10    116.992 ±     4.528   ms/op
o.a.g.perf.PropertyAccessBench.mapDotPropertyAccess                             
            N/A   avgt   10     19.304 ±     0.456   ms/op
o.a.g.perf.PropertyAccessBench.mapStyleAccess                                   
            N/A   avgt   10     31.487 ±     0.817   ms/op
o.a.g.perf.RunnerRegistryBench.listIterator                                     
            N/A   avgt   10     ≈ 10⁻⁶               ms/op
o.a.g.perf.RunnerRegistryBench.registryIterator                                 
            N/A   avgt   10     ≈ 10⁻⁵               ms/op

> ./gradlew perf:jmh -Pindy=false
Benchmark (indy=false, PR#2377=true)                                            
            (n)   Mode  Cnt      Score      Error   Units
o.a.g.bench.GeneratedHashCodeBench.generated_hashcode_on_instance_with_null_properties
      N/A  thrpt   10  78898.490 ± 3822.065  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovy                
            N/A  thrpt   10   4550.313 ±  248.824  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovyCS              
            N/A  thrpt   10  29693.024 ± 1074.878  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_java                  
            N/A  thrpt   10   8796.279 ± 1471.916  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovy                
            N/A  thrpt   10    597.731 ±   77.866  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovyCS              
            N/A  thrpt   10  23130.628 ± 4692.298  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_java                  
            N/A  thrpt   10   8401.309 ±  551.308  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovy                
            N/A  thrpt   10    479.201 ±   77.594  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovyCS              
            N/A  thrpt   10  25727.458 ± 1099.970  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_java                  
            N/A  thrpt   10   7560.142 ±  248.461  ops/ms
o.a.g.bench.AckermannBench.groovy                                               
              5   avgt   10      0.087 ±    0.006   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              6   avgt   10      0.394 ±    0.002   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              7   avgt   10      1.694 ±    0.007   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              8   avgt   10      7.128 ±    0.394   ms/op
o.a.g.bench.AckermannBench.java                                                 
              5   avgt   10      0.047 ±    0.001   ms/op
o.a.g.bench.AckermannBench.java                                                 
              6   avgt   10      0.236 ±    0.005   ms/op
o.a.g.bench.AckermannBench.java                                                 
              7   avgt   10      1.034 ±    0.005   ms/op
o.a.g.bench.AckermannBench.java                                                 
              8   avgt   10      4.347 ±    0.029   ms/op
o.a.g.bench.AryBench.groovy                                                     
             10   avgt   10      0.004 ±    0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
            100   avgt   10      0.007 ±    0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
           1000   avgt   10      0.049 ±    0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
        1000000   avgt   10     85.681 ±    2.059   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
             10   avgt   10      0.004 ±    0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
            100   avgt   10      0.007 ±    0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
           1000   avgt   10      0.049 ±    0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
        1000000   avgt   10     85.276 ±    0.754   ms/op
o.a.g.bench.AryBench.java                                                       
             10   avgt   10      0.003 ±    0.001   ms/op
o.a.g.bench.AryBench.java                                                       
            100   avgt   10      0.007 ±    0.001   ms/op
o.a.g.bench.AryBench.java                                                       
           1000   avgt   10      0.049 ±    0.002   ms/op
o.a.g.bench.AryBench.java                                                       
        1000000   avgt   10     85.304 ±    0.633   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             30   avgt   10      3.828 ±    0.017   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             31   avgt   10      6.185 ±    0.030   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             32   avgt   10     10.181 ±    0.753   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             33   avgt   10     16.220 ±    0.131   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             34   avgt   10     26.453 ±    1.317   ms/op
o.a.g.bench.FiboBench.java                                                      
             30   avgt   10      1.311 ±    0.024   ms/op
o.a.g.bench.FiboBench.java                                                      
             31   avgt   10      2.084 ±    0.030   ms/op
o.a.g.bench.FiboBench.java                                                      
             32   avgt   10      3.444 ±    0.147   ms/op
o.a.g.bench.FiboBench.java                                                      
             33   avgt   10      5.456 ±    0.142   ms/op
o.a.g.bench.FiboBench.java                                                      
             34   avgt   10      8.986 ±    0.280   ms/op
o.a.g.perf.ClosureBench.closureAsParameter                                      
            N/A   avgt   10     33.186 ±    1.015   ms/op
o.a.g.perf.ClosureBench.closureCallMethod                                       
            N/A   avgt   10     18.017 ±    0.808   ms/op
o.a.g.perf.ClosureBench.closureComposition                                      
            N/A   avgt   10     38.782 ±    0.491   ms/op
o.a.g.perf.ClosureBench.closureDelegation                                       
            N/A   avgt   10     30.825 ±    2.938   ms/op
o.a.g.perf.ClosureBench.closureModifyCapture                                    
            N/A   avgt   10     15.583 ±    7.220   ms/op
o.a.g.perf.ClosureBench.closureMultiParams                                      
            N/A   avgt   10     28.605 ±    1.646   ms/op
o.a.g.perf.ClosureBench.closureReuse                                            
            N/A   avgt   10     17.665 ±    0.751   ms/op
o.a.g.perf.ClosureBench.closureSpread                                           
            N/A   avgt   10     37.986 ±    0.509   ms/op
o.a.g.perf.ClosureBench.closureTrampoline                                       
            N/A   avgt   10     19.866 ±    0.527   ms/op
o.a.g.perf.ClosureBench.closureWithCapture                                      
            N/A   avgt   10     18.058 ±    0.490   ms/op
o.a.g.perf.ClosureBench.collectWithClosure                                      
            N/A   avgt   10     18.995 ±    0.685   ms/op
o.a.g.perf.ClosureBench.curriedClosure                                          
            N/A   avgt   10     44.519 ±    0.821   ms/op
o.a.g.perf.ClosureBench.eachWithClosure                                         
            N/A   avgt   10     18.578 ±    0.136   ms/op
o.a.g.perf.ClosureBench.findAllWithClosure                                      
            N/A   avgt   10     24.289 ±    0.242   ms/op
o.a.g.perf.ClosureBench.injectWithClosure                                       
            N/A   avgt   10     21.960 ±    0.625   ms/op
o.a.g.perf.ClosureBench.methodReference                                         
            N/A   avgt   10     35.049 ±    0.418   ms/op
o.a.g.perf.ClosureBench.nestedClosures                                          
            N/A   avgt   10     46.678 ±    2.408   ms/op
o.a.g.perf.ClosureBench.rightCurriedClosure                                     
            N/A   avgt   10     40.910 ±    0.954   ms/op
o.a.g.perf.ClosureBench.simpleClosureCreation                                   
            N/A   avgt   10     24.666 ±    0.476   ms/op
o.a.g.perf.GStringBench.gstringAsMapKey                                         
            N/A   avgt   10    141.282 ±   33.453   ms/op
o.a.g.perf.GStringBench.multiValueInterpolation                                 
            N/A   avgt   10     84.238 ±   18.801   ms/op
o.a.g.perf.GStringBench.repeatedToString                                        
            N/A   avgt   10      5.304 ±    0.220   ms/op
o.a.g.perf.GStringBench.simpleInterpolation                                     
            N/A   avgt   10     54.168 ±    3.893   ms/op
o.a.g.perf.GStringBench.stringConcatBaseline                                    
            N/A   avgt   10     25.795 ±    0.609   ms/op
o.a.g.perf.GroovyIdiomBench.asListToSet                                         
            N/A   avgt   10     87.798 ±    3.288   ms/op
o.a.g.perf.GroovyIdiomBench.asStringToInteger                                   
            N/A   avgt   10     30.067 ±    2.158   ms/op
o.a.g.perf.GroovyIdiomBench.asToString                                          
            N/A   avgt   10     35.568 ±    0.464   ms/op
o.a.g.perf.GroovyIdiomBench.collectBaseline                                     
            N/A   avgt   10     19.493 ±    0.585   ms/op
o.a.g.perf.GroovyIdiomBench.elvisEmptyString                                    
            N/A   avgt   10     16.684 ±    0.299   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNonNull                                        
            N/A   avgt   10     17.625 ±    2.038   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNull                                           
            N/A   avgt   10      3.864 ±    0.136   ms/op
o.a.g.perf.GroovyIdiomBench.normalNavBaseline                                   
            N/A   avgt   10     16.039 ±    1.700   ms/op
o.a.g.perf.GroovyIdiomBench.rangeContains                                       
            N/A   avgt   10     23.790 ±    0.778   ms/op
o.a.g.perf.GroovyIdiomBench.rangeCreation                                       
            N/A   avgt   10      4.596 ±    0.082   ms/op
o.a.g.perf.GroovyIdiomBench.rangeIteration                                      
            N/A   avgt   10     15.911 ±    0.312   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNonNull                                      
            N/A   avgt   10     34.996 ±    4.824   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNull                                         
            N/A   avgt   10      6.531 ±    0.608   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotMethod                                     
            N/A   avgt   10     21.585 ±    1.802   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotProperty                                   
            N/A   avgt   10     93.129 ±    4.586   ms/op
o.a.g.perf.GroovyIdiomBench.tapScope                                            
            N/A   avgt   10    350.520 ±   71.880   ms/op
o.a.g.perf.GroovyIdiomBench.withScope                                           
            N/A   avgt   10     81.073 ±    5.205   ms/op
o.a.g.perf.LoopsBench.eachIdentity                                              
            N/A   avgt   10     32.732 ±    1.257   ms/op
o.a.g.perf.LoopsBench.methodCallInLoop                                          
            N/A   avgt   10      7.868 ±    0.360   ms/op
o.a.g.perf.LoopsBench.nestedLoopsWithClosure                                    
            N/A   avgt   10     57.349 ±    0.921   ms/op
o.a.g.perf.LoopsBench.originalEachToString                                      
            N/A   avgt   10     35.124 ±    0.457   ms/op
o.a.g.perf.LoopsBench.reusedClosureInLoop                                       
            N/A   avgt   10     17.564 ±    0.753   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkDynamicTypedCalls                     
            N/A   avgt   10      4.067 ±    0.039   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkInterfaceMethodCalls                  
            N/A   avgt   10      3.990 ±    0.259   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithObject                      
            N/A   avgt   10     11.490 ±    0.202   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithParams                      
            N/A   avgt   10      1.064 ±    0.018   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMonomorphicCallSite                   
            N/A   avgt   10     21.255 ±    0.690   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkPolymorphicCallSite                   
            N/A   avgt   10    195.478 ±    1.272   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkSimpleMethodCalls                     
            N/A   avgt   10      0.892 ±    0.005   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodCalls                     
            N/A   avgt   10      0.824 ±    0.038   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodWithParams                
            N/A   avgt   10      1.063 ±    0.018   ms/op
o.a.g.perf.OperatorBench.bigDecimalArithmetic                                   
            N/A   avgt   10      4.115 ±    0.022   ms/op
o.a.g.perf.OperatorBench.comparisonOperators                                    
            N/A   avgt   10     ≈ 10⁻⁵              ms/op
o.a.g.perf.OperatorBench.equalsOperator                                         
            N/A   avgt   10     ≈ 10⁻⁵              ms/op
o.a.g.perf.OperatorBench.inOperator                                             
            N/A   avgt   10     41.593 ±    2.485   ms/op
o.a.g.perf.OperatorBench.integerMultiply                                        
            N/A   avgt   10      7.858 ±    0.097   ms/op
o.a.g.perf.OperatorBench.integerPlus                                            
            N/A   avgt   10      0.267 ±    0.003   ms/op
o.a.g.perf.OperatorBench.listGetAt                                              
            N/A   avgt   10     16.746 ±    0.690   ms/op
o.a.g.perf.OperatorBench.listLeftShift                                          
            N/A   avgt   10      9.787 ±    0.371   ms/op
o.a.g.perf.OperatorBench.listPutAt                                              
            N/A   avgt   10     13.391 ±    0.663   ms/op
o.a.g.perf.OperatorBench.mapGetAtPutAt                                          
            N/A   avgt   10     56.362 ±    1.934   ms/op
o.a.g.perf.OperatorBench.spaceshipOperator                                      
            N/A   avgt   10      2.644 ±    0.097   ms/op
o.a.g.perf.OperatorBench.stringMultiply                                         
            N/A   avgt   10     11.118 ±    0.464   ms/op
o.a.g.perf.OperatorBench.unaryMinus                                             
            N/A   avgt   10      3.564 ±    0.089   ms/op
o.a.g.perf.PropertyAccessBench.chainedPropertyAccess                            
            N/A   avgt   10     18.826 ±    0.411   ms/op
o.a.g.perf.PropertyAccessBench.dynamicTypedPropertyAccess                       
            N/A   avgt   10    121.599 ±    5.636   ms/op
o.a.g.perf.PropertyAccessBench.fieldReadWrite                                   
            N/A   avgt   10      0.265 ±    0.001   ms/op
o.a.g.perf.PropertyAccessBench.getterSetterAccess                               
            N/A   avgt   10    123.848 ±    0.712   ms/op
o.a.g.perf.PropertyAccessBench.mapDotPropertyAccess                             
            N/A   avgt   10     25.656 ±    2.181   ms/op
o.a.g.perf.PropertyAccessBench.mapStyleAccess                                   
            N/A   avgt   10     40.437 ±    1.163   ms/op
o.a.g.perf.RunnerRegistryBench.listIterator                                     
            N/A   avgt   10     ≈ 10⁻⁶              ms/op
o.a.g.perf.RunnerRegistryBench.registryIterator                                 
            N/A   avgt   10     ≈ 10⁻⁵              ms/op

> ./gradlew perf:performanceTests (PR#2377=true)
> Task :performance:performanceTests
Groovy 5.0.4                Average 315.02ms ± 19.65ms 
Groovy current              Average 325.37ms ± 32.06ms (3.29% slower)
Groovy 4.0.30               Average 349ms ± 59.55ms (10.79% slower)
Groovy 3.0.25               Average 406.72ms ± 132.17ms (29.11% slower)

> ./gradlew perf:jmh
Benchmark (indy=true default, PR#2377=false master)                             
            (n)   Mode  Cnt      Score       Error   Units
o.a.g.bench.GeneratedHashCodeBench.generated_hashcode_on_instance_with_null_properties
      N/A  thrpt   10  83713.724 ± 16645.285  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovy                
            N/A  thrpt   10   6448.663 ±   653.314  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovyCS              
            N/A  thrpt   10  29593.263 ±  1570.029  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_java                  
            N/A  thrpt   10   7745.707 ±   134.878  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovy                
            N/A  thrpt   10    927.648 ±    14.078  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovyCS              
            N/A  thrpt   10  26473.389 ±  1085.085  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_java                  
            N/A  thrpt   10   8200.186 ±   525.788  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovy                
            N/A  thrpt   10    830.010 ±    19.868  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovyCS              
            N/A  thrpt   10  25847.961 ±  1113.829  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_java                  
            N/A  thrpt   10   7575.447 ±   248.499  ops/ms
o.a.g.bench.AckermannBench.groovy                                               
              5   avgt   10      0.211 ±     0.010   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              6   avgt   10      0.921 ±     0.005   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              7   avgt   10      3.967 ±     0.054   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              8   avgt   10     16.821 ±     0.613   ms/op
o.a.g.bench.AckermannBench.java                                                 
              5   avgt   10      0.047 ±     0.001   ms/op
o.a.g.bench.AckermannBench.java                                                 
              6   avgt   10      0.237 ±     0.009   ms/op
o.a.g.bench.AckermannBench.java                                                 
              7   avgt   10      1.023 ±     0.006   ms/op
o.a.g.bench.AckermannBench.java                                                 
              8   avgt   10      4.247 ±     0.026   ms/op
o.a.g.bench.AryBench.groovy                                                     
             10   avgt   10      0.196 ±     0.012   ms/op
o.a.g.bench.AryBench.groovy                                                     
            100   avgt   10      1.913 ±     0.014   ms/op
o.a.g.bench.AryBench.groovy                                                     
           1000   avgt   10     20.965 ±     0.074   ms/op
o.a.g.bench.AryBench.groovy                                                     
        1000000   avgt   10  19199.337 ±  2839.641   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
             10   avgt   10      0.004 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
        1000000   avgt   10     83.958 ±     0.399   ms/op
o.a.g.bench.AryBench.java                                                       
             10   avgt   10      0.003 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
        1000000   avgt   10     84.878 ±     2.942   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             30   avgt   10      6.833 ±     0.015   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             31   avgt   10     10.830 ±     1.402   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             32   avgt   10     17.196 ±     1.128   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             33   avgt   10     27.975 ±     1.620   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             34   avgt   10     44.517 ±     3.185   ms/op
o.a.g.bench.FiboBench.java                                                      
             30   avgt   10      1.280 ±     0.018   ms/op
o.a.g.bench.FiboBench.java                                                      
             31   avgt   10      2.126 ±     0.080   ms/op
o.a.g.bench.FiboBench.java                                                      
             32   avgt   10      3.330 ±     0.051   ms/op
o.a.g.bench.FiboBench.java                                                      
             33   avgt   10      5.461 ±     0.116   ms/op
o.a.g.bench.FiboBench.java                                                      
             34   avgt   10      9.682 ±     1.522   ms/op
o.a.g.perf.ClosureBench.closureAsParameter                                      
            N/A   avgt   10     15.210 ±     0.314   ms/op
o.a.g.perf.ClosureBench.closureCallMethod                                       
            N/A   avgt   10      6.708 ±     0.564   ms/op
o.a.g.perf.ClosureBench.closureComposition                                      
            N/A   avgt   10     31.812 ±     2.251   ms/op
o.a.g.perf.ClosureBench.closureDelegation                                       
            N/A   avgt   10     16.668 ±     0.254   ms/op
o.a.g.perf.ClosureBench.closureModifyCapture                                    
            N/A   avgt   10      3.141 ±     0.052   ms/op
o.a.g.perf.ClosureBench.closureMultiParams                                      
            N/A   avgt   10     12.939 ±     1.524   ms/op
o.a.g.perf.ClosureBench.closureReuse                                            
            N/A   avgt   10      7.031 ±     0.186   ms/op
o.a.g.perf.ClosureBench.closureSpread                                           
            N/A   avgt   10    735.728 ±    26.065   ms/op
o.a.g.perf.ClosureBench.closureTrampoline                                       
            N/A   avgt   10     17.645 ±     1.526   ms/op
o.a.g.perf.ClosureBench.closureWithCapture                                      
            N/A   avgt   10      7.243 ±     0.165   ms/op
o.a.g.perf.ClosureBench.collectWithClosure                                      
            N/A   avgt   10     19.371 ±     0.690   ms/op
o.a.g.perf.ClosureBench.curriedClosure                                          
            N/A   avgt   10     41.526 ±     3.119   ms/op
o.a.g.perf.ClosureBench.eachWithClosure                                         
            N/A   avgt   10     19.257 ±     0.261   ms/op
o.a.g.perf.ClosureBench.findAllWithClosure                                      
            N/A   avgt   10     27.427 ±     0.311   ms/op
o.a.g.perf.ClosureBench.injectWithClosure                                       
            N/A   avgt   10     20.346 ±     0.379   ms/op
o.a.g.perf.ClosureBench.methodReference                                         
            N/A   avgt   10     34.811 ±     5.018   ms/op
o.a.g.perf.ClosureBench.nestedClosures                                          
            N/A   avgt   10     18.429 ±     0.848   ms/op
o.a.g.perf.ClosureBench.rightCurriedClosure                                     
            N/A   avgt   10     36.909 ±     0.178   ms/op
o.a.g.perf.ClosureBench.simpleClosureCreation                                   
            N/A   avgt   10     12.442 ±     0.093   ms/op
o.a.g.perf.GStringBench.gstringAsMapKey                                         
            N/A   avgt   10    115.188 ±    57.294   ms/op
o.a.g.perf.GStringBench.multiValueInterpolation                                 
            N/A   avgt   10    127.134 ±     6.101   ms/op
o.a.g.perf.GStringBench.repeatedToString                                        
            N/A   avgt   10      3.295 ±     0.024   ms/op
o.a.g.perf.GStringBench.simpleInterpolation                                     
            N/A   avgt   10     52.900 ±     3.176   ms/op
o.a.g.perf.GStringBench.stringConcatBaseline                                    
            N/A   avgt   10     24.570 ±     1.716   ms/op
o.a.g.perf.GroovyIdiomBench.asListToSet                                         
            N/A   avgt   10     68.991 ±     0.945   ms/op
o.a.g.perf.GroovyIdiomBench.asStringToInteger                                   
            N/A   avgt   10     29.707 ±     1.005   ms/op
o.a.g.perf.GroovyIdiomBench.asToString                                          
            N/A   avgt   10     21.095 ±     0.315   ms/op
o.a.g.perf.GroovyIdiomBench.collectBaseline                                     
            N/A   avgt   10     17.321 ±     5.326   ms/op
o.a.g.perf.GroovyIdiomBench.elvisEmptyString                                    
            N/A   avgt   10      5.071 ±     0.590   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNonNull                                        
            N/A   avgt   10      5.122 ±     1.010   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNull                                           
            N/A   avgt   10      2.485 ±     0.040   ms/op
o.a.g.perf.GroovyIdiomBench.normalNavBaseline                                   
            N/A   avgt   10      4.025 ±     0.168   ms/op
o.a.g.perf.GroovyIdiomBench.rangeContains                                       
            N/A   avgt   10     25.349 ±     0.898   ms/op
o.a.g.perf.GroovyIdiomBench.rangeCreation                                       
            N/A   avgt   10      4.495 ±     0.357   ms/op
o.a.g.perf.GroovyIdiomBench.rangeIteration                                      
            N/A   avgt   10     15.627 ±     0.361   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNonNull                                      
            N/A   avgt   10      7.102 ±     1.686   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNull                                         
            N/A   avgt   10      2.426 ±     0.119   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotMethod                                     
            N/A   avgt   10     22.024 ±     2.185   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotProperty                                   
            N/A   avgt   10     89.519 ±     7.312   ms/op
o.a.g.perf.GroovyIdiomBench.tapScope                                            
            N/A   avgt   10    341.084 ±    75.867   ms/op
o.a.g.perf.GroovyIdiomBench.withScope                                           
            N/A   avgt   10     71.554 ±     9.999   ms/op
o.a.g.perf.LoopsBench.eachIdentity                                              
            N/A   avgt   10     30.147 ±     0.111   ms/op
o.a.g.perf.LoopsBench.methodCallInLoop                                          
            N/A   avgt   10      3.896 ±     0.285   ms/op
o.a.g.perf.LoopsBench.nestedLoopsWithClosure                                    
            N/A   avgt   10     52.584 ±     2.538   ms/op
o.a.g.perf.LoopsBench.originalEachToString                                      
            N/A   avgt   10     32.164 ±     0.277   ms/op
o.a.g.perf.LoopsBench.reusedClosureInLoop                                       
            N/A   avgt   10      3.952 ±     0.130   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkDynamicTypedCalls                     
            N/A   avgt   10      2.780 ±     0.020   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkInterfaceMethodCalls                  
            N/A   avgt   10      2.734 ±     0.318   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithObject                      
            N/A   avgt   10      9.301 ±     0.160   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithParams                      
            N/A   avgt   10      7.418 ±     0.205   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMonomorphicCallSite                   
            N/A   avgt   10     32.682 ±     0.502   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkPolymorphicCallSite                   
            N/A   avgt   10   1488.182 ±    52.175   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkSimpleMethodCalls                     
            N/A   avgt   10      2.721 ±     0.102   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodCalls                     
            N/A   avgt   10      2.415 ±     0.022   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodWithParams                
            N/A   avgt   10      7.222 ±     0.065   ms/op
o.a.g.perf.OperatorBench.bigDecimalArithmetic                                   
            N/A   avgt   10      7.514 ±     0.067   ms/op
o.a.g.perf.OperatorBench.comparisonOperators                                    
            N/A   avgt   10      1.764 ±     0.021   ms/op
o.a.g.perf.OperatorBench.equalsOperator                                         
            N/A   avgt   10      1.679 ±     0.017   ms/op
o.a.g.perf.OperatorBench.inOperator                                             
            N/A   avgt   10     42.621 ±     1.072   ms/op
o.a.g.perf.OperatorBench.integerMultiply                                        
            N/A   avgt   10     12.460 ±     0.927   ms/op
o.a.g.perf.OperatorBench.integerPlus                                            
            N/A   avgt   10      2.470 ±     0.063   ms/op
o.a.g.perf.OperatorBench.listGetAt                                              
            N/A   avgt   10     14.303 ±     2.946   ms/op
o.a.g.perf.OperatorBench.listLeftShift                                          
            N/A   avgt   10     15.861 ±     0.579   ms/op
o.a.g.perf.OperatorBench.listPutAt                                              
            N/A   avgt   10     15.045 ±     1.637   ms/op
o.a.g.perf.OperatorBench.mapGetAtPutAt                                          
            N/A   avgt   10     60.843 ±     1.579   ms/op
o.a.g.perf.OperatorBench.spaceshipOperator                                      
            N/A   avgt   10      6.202 ±     0.383   ms/op
o.a.g.perf.OperatorBench.stringMultiply                                         
            N/A   avgt   10     10.523 ±     0.243   ms/op
o.a.g.perf.OperatorBench.unaryMinus                                             
            N/A   avgt   10      2.650 ±     0.032   ms/op
o.a.g.perf.PropertyAccessBench.chainedPropertyAccess                            
            N/A   avgt   10      8.314 ±     0.210   ms/op
o.a.g.perf.PropertyAccessBench.dynamicTypedPropertyAccess                       
            N/A   avgt   10    114.626 ±    10.340   ms/op
o.a.g.perf.PropertyAccessBench.fieldReadWrite                                   
            N/A   avgt   10      2.632 ±     0.034   ms/op
o.a.g.perf.PropertyAccessBench.getterSetterAccess                               
            N/A   avgt   10    117.448 ±     2.834   ms/op
o.a.g.perf.PropertyAccessBench.mapDotPropertyAccess                             
            N/A   avgt   10     18.670 ±     0.490   ms/op
o.a.g.perf.PropertyAccessBench.mapStyleAccess                                   
            N/A   avgt   10     31.791 ±     0.391   ms/op
o.a.g.perf.RunnerRegistryBench.listIterator                                     
            N/A   avgt   10     ≈ 10⁻⁶               ms/op
o.a.g.perf.RunnerRegistryBench.registryIterator                                 
            N/A   avgt   10     ≈ 10⁻⁵               ms/op

> ./gradlew perf:jmh -Pindy=false
Benchmark (indy=false, PR#2377=false master)                                    
            (n)   Mode  Cnt      Score       Error   Units
o.a.g.bench.GeneratedHashCodeBench.generated_hashcode_on_instance_with_null_properties
      N/A  thrpt   10  89181.721 ± 14674.089  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovy                
            N/A  thrpt   10   4688.067 ±   226.816  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_groovyCS              
            N/A  thrpt   10  30083.042 ±   143.347  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_1_monomorphic_java                  
            N/A  thrpt   10   7821.284 ±   155.889  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovy                
            N/A  thrpt   10    589.072 ±    31.917  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_groovyCS              
            N/A  thrpt   10  26813.203 ±   901.505  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_3_polymorphic_java                  
            N/A  thrpt   10   8631.155 ±   491.118  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovy                
            N/A  thrpt   10    517.325 ±    65.930  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_groovyCS              
            N/A  thrpt   10  26043.215 ±   595.580  ops/ms
o.a.g.bench.dispatch.CallsiteBench.dispatch_8_megamorphic_java                  
            N/A  thrpt   10   7731.293 ±   328.118  ops/ms
o.a.g.bench.AckermannBench.groovy                                               
              5   avgt   10      0.086 ±     0.004   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              6   avgt   10      0.390 ±     0.001   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              7   avgt   10      1.675 ±     0.005   ms/op
o.a.g.bench.AckermannBench.groovy                                               
              8   avgt   10      6.993 ±     0.101   ms/op
o.a.g.bench.AckermannBench.java                                                 
              5   avgt   10      0.046 ±     0.002   ms/op
o.a.g.bench.AckermannBench.java                                                 
              6   avgt   10      0.222 ±     0.002   ms/op
o.a.g.bench.AckermannBench.java                                                 
              7   avgt   10      0.985 ±     0.026   ms/op
o.a.g.bench.AckermannBench.java                                                 
              8   avgt   10      4.112 ±     0.053   ms/op
o.a.g.bench.AryBench.groovy                                                     
             10   avgt   10      0.003 ±     0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.groovy                                                     
        1000000   avgt   10     85.176 ±     2.105   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
             10   avgt   10      0.003 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.groovyCS                                                   
        1000000   avgt   10     84.501 ±     0.718   ms/op
o.a.g.bench.AryBench.java                                                       
             10   avgt   10      0.002 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
            100   avgt   10      0.007 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
           1000   avgt   10      0.049 ±     0.001   ms/op
o.a.g.bench.AryBench.java                                                       
        1000000   avgt   10     84.965 ±     2.261   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             30   avgt   10      3.790 ±     0.015   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             31   avgt   10      6.134 ±     0.018   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             32   avgt   10     10.010 ±     0.275   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             33   avgt   10     16.067 ±     0.061   ms/op
o.a.g.bench.FiboBench.groovy                                                    
             34   avgt   10     26.417 ±     0.958   ms/op
o.a.g.bench.FiboBench.java                                                      
             30   avgt   10      1.289 ±     0.018   ms/op
o.a.g.bench.FiboBench.java                                                      
             31   avgt   10      2.093 ±     0.034   ms/op
o.a.g.bench.FiboBench.java                                                      
             32   avgt   10      3.421 ±     0.093   ms/op
o.a.g.bench.FiboBench.java                                                      
             33   avgt   10      5.385 ±     0.161   ms/op
o.a.g.bench.FiboBench.java                                                      
             34   avgt   10      9.665 ±     1.480   ms/op
o.a.g.perf.ClosureBench.closureAsParameter                                      
            N/A   avgt   10     33.437 ±     1.302   ms/op
o.a.g.perf.ClosureBench.closureCallMethod                                       
            N/A   avgt   10     17.887 ±     0.802   ms/op
o.a.g.perf.ClosureBench.closureComposition                                      
            N/A   avgt   10     36.639 ±     0.272   ms/op
o.a.g.perf.ClosureBench.closureDelegation                                       
            N/A   avgt   10     29.557 ±     2.384   ms/op
o.a.g.perf.ClosureBench.closureModifyCapture                                    
            N/A   avgt   10     15.657 ±     7.181   ms/op
o.a.g.perf.ClosureBench.closureMultiParams                                      
            N/A   avgt   10     28.135 ±     0.970   ms/op
o.a.g.perf.ClosureBench.closureReuse                                            
            N/A   avgt   10     17.756 ±     0.748   ms/op
o.a.g.perf.ClosureBench.closureSpread                                           
            N/A   avgt   10     36.981 ±     0.675   ms/op
o.a.g.perf.ClosureBench.closureTrampoline                                       
            N/A   avgt   10     19.633 ±     0.195   ms/op
o.a.g.perf.ClosureBench.closureWithCapture                                      
            N/A   avgt   10     18.202 ±     0.791   ms/op
o.a.g.perf.ClosureBench.collectWithClosure                                      
            N/A   avgt   10     19.073 ±     0.190   ms/op
o.a.g.perf.ClosureBench.curriedClosure                                          
            N/A   avgt   10     43.811 ±     1.005   ms/op
o.a.g.perf.ClosureBench.eachWithClosure                                         
            N/A   avgt   10     18.324 ±     0.378   ms/op
o.a.g.perf.ClosureBench.findAllWithClosure                                      
            N/A   avgt   10     23.540 ±     0.187   ms/op
o.a.g.perf.ClosureBench.injectWithClosure                                       
            N/A   avgt   10     21.440 ±     0.559   ms/op
o.a.g.perf.ClosureBench.methodReference                                         
            N/A   avgt   10     36.842 ±     1.248   ms/op
o.a.g.perf.ClosureBench.nestedClosures                                          
            N/A   avgt   10     44.715 ±     1.986   ms/op
o.a.g.perf.ClosureBench.rightCurriedClosure                                     
            N/A   avgt   10     40.641 ±     0.522   ms/op
o.a.g.perf.ClosureBench.simpleClosureCreation                                   
            N/A   avgt   10     24.071 ±     0.087   ms/op
o.a.g.perf.GStringBench.gstringAsMapKey                                         
            N/A   avgt   10    175.339 ±     6.989   ms/op
o.a.g.perf.GStringBench.multiValueInterpolation                                 
            N/A   avgt   10     87.773 ±    12.617   ms/op
o.a.g.perf.GStringBench.repeatedToString                                        
            N/A   avgt   10      5.096 ±     0.054   ms/op
o.a.g.perf.GStringBench.simpleInterpolation                                     
            N/A   avgt   10     53.663 ±     4.211   ms/op
o.a.g.perf.GStringBench.stringConcatBaseline                                    
            N/A   avgt   10     24.912 ±     0.343   ms/op
o.a.g.perf.GroovyIdiomBench.asListToSet                                         
            N/A   avgt   10     86.651 ±     0.911   ms/op
o.a.g.perf.GroovyIdiomBench.asStringToInteger                                   
            N/A   avgt   10     29.976 ±     0.791   ms/op
o.a.g.perf.GroovyIdiomBench.asToString                                          
            N/A   avgt   10     35.568 ±     0.734   ms/op
o.a.g.perf.GroovyIdiomBench.collectBaseline                                     
            N/A   avgt   10     19.284 ±     0.917   ms/op
o.a.g.perf.GroovyIdiomBench.elvisEmptyString                                    
            N/A   avgt   10     16.591 ±     0.175   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNonNull                                        
            N/A   avgt   10     17.046 ±     0.941   ms/op
o.a.g.perf.GroovyIdiomBench.elvisNull                                           
            N/A   avgt   10      3.776 ±     0.013   ms/op
o.a.g.perf.GroovyIdiomBench.normalNavBaseline                                   
            N/A   avgt   10     15.975 ±     1.791   ms/op
o.a.g.perf.GroovyIdiomBench.rangeContains                                       
            N/A   avgt   10     22.291 ±     1.017   ms/op
o.a.g.perf.GroovyIdiomBench.rangeCreation                                       
            N/A   avgt   10      4.459 ±     0.043   ms/op
o.a.g.perf.GroovyIdiomBench.rangeIteration                                      
            N/A   avgt   10     15.550 ±     0.315   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNonNull                                      
            N/A   avgt   10     30.232 ±     0.703   ms/op
o.a.g.perf.GroovyIdiomBench.safeNavNull                                         
            N/A   avgt   10      6.118 ±     0.107   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotMethod                                     
            N/A   avgt   10     20.806 ±     0.234   ms/op
o.a.g.perf.GroovyIdiomBench.spreadDotProperty                                   
            N/A   avgt   10     90.484 ±     0.878   ms/op
o.a.g.perf.GroovyIdiomBench.tapScope                                            
            N/A   avgt   10    298.214 ±    17.329   ms/op
o.a.g.perf.GroovyIdiomBench.withScope                                           
            N/A   avgt   10     75.685 ±     2.111   ms/op
o.a.g.perf.LoopsBench.eachIdentity                                              
            N/A   avgt   10     31.295 ±     1.213   ms/op
o.a.g.perf.LoopsBench.methodCallInLoop                                          
            N/A   avgt   10      7.945 ±     0.252   ms/op
o.a.g.perf.LoopsBench.nestedLoopsWithClosure                                    
            N/A   avgt   10     56.470 ±     0.509   ms/op
o.a.g.perf.LoopsBench.originalEachToString                                      
            N/A   avgt   10     33.400 ±     0.503   ms/op
o.a.g.perf.LoopsBench.reusedClosureInLoop                                       
            N/A   avgt   10     17.479 ±     0.380   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkDynamicTypedCalls                     
            N/A   avgt   10      4.010 ±     0.020   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkInterfaceMethodCalls                  
            N/A   avgt   10      3.927 ±     0.229   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithObject                      
            N/A   avgt   10     11.194 ±     0.155   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMethodWithParams                      
            N/A   avgt   10      1.054 ±     0.001   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkMonomorphicCallSite                   
            N/A   avgt   10     20.695 ±     0.144   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkPolymorphicCallSite                   
            N/A   avgt   10    191.483 ±    10.141   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkSimpleMethodCalls                     
            N/A   avgt   10      0.871 ±     0.005   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodCalls                     
            N/A   avgt   10      0.792 ±     0.037   ms/op
o.a.g.perf.MethodInvocationBench.benchmarkStaticMethodWithParams                
            N/A   avgt   10      1.052 ±     0.001   ms/op
o.a.g.perf.OperatorBench.bigDecimalArithmetic                                   
            N/A   avgt   10      4.050 ±     0.024   ms/op
o.a.g.perf.OperatorBench.comparisonOperators                                    
            N/A   avgt   10     ≈ 10⁻⁵               ms/op
o.a.g.perf.OperatorBench.equalsOperator                                         
            N/A   avgt   10     ≈ 10⁻⁵               ms/op
o.a.g.perf.OperatorBench.inOperator                                             
            N/A   avgt   10     40.564 ±     1.067   ms/op
o.a.g.perf.OperatorBench.integerMultiply                                        
            N/A   avgt   10      7.800 ±     0.069   ms/op
o.a.g.perf.OperatorBench.integerPlus                                            
            N/A   avgt   10      0.263 ±     0.001   ms/op
o.a.g.perf.OperatorBench.listGetAt                                              
            N/A   avgt   10     16.260 ±     0.094   ms/op
o.a.g.perf.OperatorBench.listLeftShift                                          
            N/A   avgt   10      9.612 ±     0.335   ms/op
o.a.g.perf.OperatorBench.listPutAt                                              
            N/A   avgt   10     12.924 ±     0.107   ms/op
o.a.g.perf.OperatorBench.mapGetAtPutAt                                          
            N/A   avgt   10     56.480 ±     3.161   ms/op
o.a.g.perf.OperatorBench.spaceshipOperator                                      
            N/A   avgt   10      2.542 ±     0.011   ms/op
o.a.g.perf.OperatorBench.stringMultiply                                         
            N/A   avgt   10     10.670 ±     0.053   ms/op
o.a.g.perf.OperatorBench.unaryMinus                                             
            N/A   avgt   10      3.478 ±     0.212   ms/op
o.a.g.perf.PropertyAccessBench.chainedPropertyAccess                            
            N/A   avgt   10     18.070 ±     0.180   ms/op
o.a.g.perf.PropertyAccessBench.dynamicTypedPropertyAccess                       
            N/A   avgt   10    125.475 ±     8.876   ms/op
o.a.g.perf.PropertyAccessBench.fieldReadWrite                                   
            N/A   avgt   10      0.264 ±     0.001   ms/op
o.a.g.perf.PropertyAccessBench.getterSetterAccess                               
            N/A   avgt   10    119.031 ±     7.092   ms/op
o.a.g.perf.PropertyAccessBench.mapDotPropertyAccess                             
            N/A   avgt   10     25.280 ±     0.720   ms/op
o.a.g.perf.PropertyAccessBench.mapStyleAccess                                   
            N/A   avgt   10     39.879 ±     2.143   ms/op
o.a.g.perf.RunnerRegistryBench.listIterator                                     
            N/A   avgt   10     ≈ 10⁻⁶               ms/op
o.a.g.perf.RunnerRegistryBench.registryIterator                                 
            N/A   avgt   10     ≈ 10⁻⁵               ms/op

> ./gradlew perf:performanceTests (PR#2377=false master)
> Task :performance:performanceTests
Groovy current              Average 304.99ms ± 11.74ms 
Groovy 5.0.4                Average 309.56ms ± 16.35ms (1.5% slower)
Groovy 4.0.30               Average 367.11ms ± 67.88ms (20.37% slower)
Groovy 3.0.25               Average 400.55ms ± 124.15ms (31.33% slower)
{noformat}

h3. Benchmark Results Summary for PR #2377

I ran runtime benchmarks (indy vs classic, with and without PR #2377) along 
with the {{performanceTests}} task (compiler-focused).
h4. Runtime Performance

The results indicate that PR #2377 *substantially improves indy runtime 
performance* and significantly reduces the gap described in GROOVY-10307.

Before the patch, indy showed a noticeable regression relative to classic in 
several dynamic-heavy benchmarks (consistent with previously observed ~2× 
slowdowns in some scenarios). After applying the PR:
 * The indy/classic gap is *significantly reduced* across most benchmarks.

 * In several cases, indy is now effectively on par with classic.

 * No new runtime regressions were observed.

 * Classic performance is unaffected (no measurable slowdowns).

There remain a few cases where indy is still slightly behind classic, but the 
large regression previously observed appears to be addressed.
h4. Compiler Performance ({{{}performanceTests{}}})

Since this PR targets runtime behavior, compiler benchmarks were expected to 
remain stable. The results confirm:
 * No material compile-time regressions.

 * Minor fluctuations fall within normal variance.

h4. Overall Assessment

PR #2377 appears to:
 * Address the indy runtime regression described in GROOVY-10307.

 * Improve parity between indy and classic execution.

 * Introduce no measurable downside in runtime or compiler performance.

Based on these benchmark results, the change appears effective and low risk.

> Groovy 4 runtime performance on average 2.4x slower than Groovy 3
> -----------------------------------------------------------------
>
>                 Key: GROOVY-10307
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10307
>             Project: Groovy
>          Issue Type: Bug
>          Components: bytecode, performance
>    Affects Versions: 4.0.0-beta-1, 3.0.9
>         Environment: OpenJDK Runtime Environment AdoptOpenJDK-11.0.11+9 
> (build 11.0.11+9)
> OpenJDK 64-Bit Server VM AdoptOpenJDK-11.0.11+9 (build 11.0.11+9, mixed mode)
> WIN10 (tests) / REL 8 (web application)
> IntelliJ 2021.2 
>            Reporter: mgroovy
>            Priority: Major
>         Attachments: groovy_3_0_9_gc.png, groovy_3_0_9_loop2.png, 
> groovy_3_0_9_loop4.png, groovy_3_0_9_mem.png, groovy_4_0_0_b1_loop2.png, 
> groovy_4_0_0_b1_loop4.png, groovy_4_0_0_b1_loop4_gc.png, 
> groovy_4_0_0_b1_loop4_mem.png, 
> groovysql_performance_groovy4_2_xx_yy_zzzz.groovy, loops.groovy, 
> profile3.txt, profile4-loops.txt, profile4.txt, profile4d.txt
>
>
> Groovy 4.0.0-beta-1 runtime performance in our framework is on average 2 to 3 
> times slower compared to using Groovy 3.0.9 (regular i.e. non-INDY)
> * Our complete framework and application code is completely written in 
> Groovy, spread over multiple IntelliJ modules
> ** mixed @CompileDynamic/@TypeChecked and @CompileStatic
> ** No Java classes left in project, i.e. no cross compilation occurs
> * We build using IntelliJ 2021.2 Groovy build process, then run / deploy the 
> compiled class files
> ** We do _not_ use a Groovy based DSL, nor do we execute Groovy scripts 
> during execution
> * Performance degradation when using Groovy 4.0.0-beta-1 instead of Groovy 
> 3.0.9 (non-INDY):
> ** The performance of the largest of our web applications has dropped 3x 
> (startup) / 2x (table refresh) respectively
> *** Stack: Tomcat/Vaadin/Ebean plus framework generated SQL
> ** Our test suite runs about 2.4 times as long as before (120 min when using 
> G4, compared to about 50 min with G3)
> *** JUnit 5 
> *** test suite also contains no scripts / dynamic code execution
> *** Individual test performance varies: A small number of tests runs faster, 
> but the majority is slower, with some extreme cases taking nearly 10x as long 
> to finish
> * Using Groovy 3.0.9 INDY displays nearly identical performance degradation, 
> so it seems that the use of invoke dynamic is somehow at fault



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to