[
https://issues.apache.org/jira/browse/GROOVY-10307?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18060954#comment-18060954
]
Paul King commented on GROOVY-10307:
------------------------------------
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)