Bytecode Analysis for script: collectloop

        List numbers = [1, 2, 3]
List results = numbers.collect {
    it * 2
}
println results

      
Groovyc Indy Static
Lines Removed 4 4 4
Total Lines - Before 245 140 153
Percentage of Lines Removed 1.6 2.9 2.6

Benchmarks

For parameter: 1000

Groovyc Indy Static
Benchmark Average - Before 418 467 329
Benchmark Average - After 413 450 326
Benchmark Std Dev - Before 5.4 8.4 7.58
Benchmark Std Dev - After 6.77 6.82 7.31

For parameter: 100000

Groovyc Indy Static
Benchmark Average - Before 434 448 337
Benchmark Average - After 416 449 325
Benchmark Std Dev - Before 11.32 6.43 7.74
Benchmark Std Dev - After 8.44 6.05 6.5

For parameter: 1000000

Groovyc Indy Static
Benchmark Average - Before 435 451 321
Benchmark Average - After 413 447 320
Benchmark Std Dev - Before 9.66 8.29 3.99
Benchmark Std Dev - After 5.41 5.6 4.58

For parameter: 100000000

Groovyc Indy Static
Benchmark Average - Before 433 448 323
Benchmark Average - After 415 449 322
Benchmark Std Dev - Before 7.94 5.69 5.79
Benchmark Std Dev - After 6.78 7.2 5.2

For parameter: 100000000000

Groovyc Indy Static
Benchmark Average - Before 433 449 325
Benchmark Average - After 415 448 324
Benchmark Std Dev - Before 8.61 6.12 5.52
Benchmark Std Dev - After 6.5 6.26 5.82

BEFORE

Groovyc (Legacy)

          Compiled from "collectloop.groovy"
public class collectloop extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public collectloop();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       7: astore_1
       8: return

  public collectloop(groovy.lang.Binding);
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_2
       4: aload_0
       5: aload_1
       6: invokespecial #22                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       9: return

  public static void main(java.lang.String...);
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_1
       4: aload_1
       5: ldc           #27                 // int 0
       7: aaload
       8: ldc           #29                 // class org/codehaus/groovy/runtime/InvokerHelper
      10: ldc           #2                  // class collectloop
      12: aload_0
      13: invokeinterface #35,  4           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
      18: pop
      19: return

  public java.lang.Object run();
    Code:
       0: invokestatic  #17                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_1
       4: iconst_3
       5: anewarray     #41                 // class java/lang/Object
       8: dup
       9: iconst_0
      10: iconst_1
      11: invokestatic  #47                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      14: aastore
      15: dup
      16: iconst_1
      17: iconst_2
      18: invokestatic  #47                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      21: aastore
      22: dup
      23: iconst_2
      24: iconst_3
      25: invokestatic  #47                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      28: aastore
      29: invokestatic  #53                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.createList:([Ljava/lang/Object;)Ljava/util/List;
      32: astore_2
      33: aload_2
      34: pop
      35: aload_1
      36: ldc           #54                 // int 1
      38: aaload
      39: aload_2
      40: new           #56                 // class collectloop$_run_closure1
      43: dup
      44: aload_0
      45: aload_0
      46: invokespecial #59                 // Method collectloop$_run_closure1."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      49: invokeinterface #62,  3           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
      54: ldc           #64                 // class java/util/List
      56: invokestatic  #68                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
      59: checkcast     #64                 // class java/util/List
      62: astore_3
      63: aload_3
      64: pop
      65: aload_1
      66: ldc           #69                 // int 2
      68: aaload
      69: aload_0
      70: aload_3
      71: invokeinterface #73,  3           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.callCurrent:(Lgroovy/lang/GroovyObject;Ljava/lang/Object;)Ljava/lang/Object;
      76: areturn
      77: aconst_null
      78: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #82                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #86                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #88                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #82                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #94                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #88                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #97                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Invoke Dynamic

          Compiled from "collectloop.groovy"
public class collectloop extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public collectloop();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: return

  public collectloop(groovy.lang.Binding);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #18                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       5: return

  public static void main(java.lang.String...);
    Code:
       0: ldc           #24                 // class org/codehaus/groovy/runtime/InvokerHelper
       2: ldc           #2                  // class collectloop
       4: aload_0
       5: invokedynamic #38,  0             // InvokeDynamic #0:invoke:(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/String;)Ljava/lang/Object;
      10: pop
      11: return

  public java.lang.Object run();
    Code:
       0: iconst_3
       1: anewarray     #44                 // class java/lang/Object
       4: dup
       5: iconst_0
       6: iconst_1
       7: invokestatic  #50                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      10: aastore
      11: dup
      12: iconst_1
      13: iconst_2
      14: invokestatic  #50                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      17: aastore
      18: dup
      19: iconst_2
      20: iconst_3
      21: invokestatic  #50                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      24: aastore
      25: invokestatic  #56                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.createList:([Ljava/lang/Object;)Ljava/util/List;
      28: astore_1
      29: aload_1
      30: pop
      31: aload_1
      32: new           #58                 // class collectloop$_run_closure1
      35: dup
      36: aload_0
      37: aload_0
      38: invokespecial #61                 // Method collectloop$_run_closure1."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      41: invokedynamic #66,  0             // InvokeDynamic #1:invoke:(Ljava/util/List;Lgroovy/lang/Closure;)Ljava/lang/Object;
      46: invokedynamic #72,  0             // InvokeDynamic #2:cast:(Ljava/lang/Object;)Ljava/util/List;
      51: astore_2
      52: aload_2
      53: pop
      54: aload_0
      55: aload_2
      56: invokedynamic #78,  0             // InvokeDynamic #3:invoke:(Lcollectloop;Ljava/util/List;)Ljava/lang/Object;
      61: areturn
      62: nop
      63: athrow

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #89                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #93                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #95                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #89                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #101                // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #95                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #104                // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Static Compilation

          Compiled from "collectloop.groovy"
public class collectloop extends groovy.lang.Script {
  public static transient boolean __$stMC;

  public collectloop();
    Code:
       0: aload_0
       1: invokespecial #13                 // Method groovy/lang/Script."<init>":()V
       4: return

  public collectloop(groovy.lang.Binding);
    Code:
       0: aload_0
       1: aload_1
       2: invokespecial #18                 // Method groovy/lang/Script."<init>":(Lgroovy/lang/Binding;)V
       5: return

  public static void main(java.lang.String...);
    Code:
       0: ldc           #2                  // class collectloop
       2: aload_0
       3: invokestatic  #28                 // Method org/codehaus/groovy/runtime/InvokerHelper.runScript:(Ljava/lang/Class;[Ljava/lang/String;)Ljava/lang/Object;
       6: pop
       7: return

  public java.lang.Object run();
    Code:
       0: iconst_3
       1: anewarray     #34                 // class java/lang/Object
       4: dup
       5: iconst_0
       6: iconst_1
       7: invokestatic  #40                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      10: aastore
      11: dup
      12: iconst_1
      13: iconst_2
      14: invokestatic  #40                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      17: aastore
      18: dup
      19: iconst_2
      20: iconst_3
      21: invokestatic  #40                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      24: aastore
      25: invokestatic  #46                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.createList:([Ljava/lang/Object;)Ljava/util/List;
      28: astore_1
      29: aload_1
      30: pop
      31: aload_1
      32: new           #48                 // class collectloop$_run_closure1
      35: dup
      36: aload_0
      37: aload_0
      38: invokespecial #51                 // Method collectloop$_run_closure1."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      41: invokestatic  #57                 // Method org/codehaus/groovy/runtime/DefaultGroovyMethods.collect:(Ljava/util/Collection;Lgroovy/lang/Closure;)Ljava/util/List;
      44: astore_2
      45: aload_2
      46: pop
      47: aload_0
      48: checkcast     #2                  // class collectloop
      51: aload_2
      52: invokevirtual #61                 // Method println:(Ljava/lang/Object;)V
      55: aconst_null
      56: areturn
      57: aconst_null
      58: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #70                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #74                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #76                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #70                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #82                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #76                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #85                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

AFTER

Groovyc (Legacy)

          Compiled from "collectloop.groovy"
public class collectloop$_run_closure1 extends groovy.lang.Closure implements org.codehaus.groovy.runtime.GeneratedClosure {
  public static transient boolean __$stMC;

  public collectloop$_run_closure1(java.lang.Object, java.lang.Object);
    Code:
       0: invokestatic  #25                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_3
       4: aload_0
       5: aload_1
       6: aload_2
       7: invokespecial #27                 // Method groovy/lang/Closure."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
      10: return

  public java.lang.Object doCall(java.lang.Object);
    Code:
       0: invokestatic  #25                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_2
       4: aload_2
       5: ldc           #35                 // int 0
       7: aaload
       8: aload_1
       9: iconst_2
      10: invokestatic  #41                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      13: invokeinterface #47,  3           // InterfaceMethod org/codehaus/groovy/runtime/callsite/CallSite.call:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
      18: areturn
      19: aconst_null
      20: areturn

  public java.lang.Object doCall();
    Code:
       0: invokestatic  #25                 // Method $getCallSiteArray:()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
       3: astore_1
       4: aload_0
       5: aconst_null
       6: invokevirtual #50                 // Method doCall:(Ljava/lang/Object;)Ljava/lang/Object;
       9: areturn
      10: aconst_null
      11: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #58                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop$_run_closure1
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #64                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #66                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #58                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #72                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #66                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #75                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Invoke Dynamic

          Compiled from "collectloop.groovy"
public class collectloop$_run_closure1 extends groovy.lang.Closure implements org.codehaus.groovy.runtime.GeneratedClosure {
  public static transient boolean __$stMC;

  public collectloop$_run_closure1(java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokespecial #21                 // Method groovy/lang/Closure."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
       6: return

  public java.lang.Object doCall(java.lang.Object);
    Code:
       0: aload_1
       1: iconst_2
       2: invokedynamic #42,  0             // InvokeDynamic #0:invoke:(Ljava/lang/Object;I)Ljava/lang/Object;
       7: areturn
       8: nop
       9: athrow

  public java.lang.Object doCall();
    Code:
       0: aload_0
       1: aconst_null
       2: invokevirtual #47                 // Method doCall:(Ljava/lang/Object;)Ljava/lang/Object;
       5: areturn
       6: nop
       7: athrow

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #55                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop$_run_closure1
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #61                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #63                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #55                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #69                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #63                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #72                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}

        

Static Compilation

          Compiled from "collectloop.groovy"
public class collectloop$_run_closure1 extends groovy.lang.Closure implements org.codehaus.groovy.runtime.GeneratedClosure {
  public static transient boolean __$stMC;

  public collectloop$_run_closure1(java.lang.Object, java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: aload_2
       3: invokespecial #21                 // Method groovy/lang/Closure."<init>":(Ljava/lang/Object;Ljava/lang/Object;)V
       6: return

  public java.lang.Object doCall(java.lang.Object);
    Code:
       0: aload_1
       1: ldc           #30                 // class java/lang/Number
       3: invokestatic  #36                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.castToType:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
       6: checkcast     #30                 // class java/lang/Number
       9: iconst_2
      10: invokestatic  #42                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
      13: invokestatic  #48                 // Method org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.multiply:(Ljava/lang/Number;Ljava/lang/Number;)Ljava/lang/Number;
      16: areturn
      17: aconst_null
      18: areturn

  public java.lang.Object call(java.lang.Object);
    Code:
       0: aload_0
       1: aload_1
       2: invokevirtual #52                 // Method doCall:(Ljava/lang/Object;)Ljava/lang/Object;
       5: areturn
       6: aconst_null
       7: areturn

  public java.lang.Object call();
    Code:
       0: aload_0
       1: aconst_null
       2: invokevirtual #52                 // Method doCall:(Ljava/lang/Object;)Ljava/lang/Object;
       5: areturn
       6: aconst_null
       7: areturn

  public java.lang.Object doCall();
    Code:
       0: aload_0
       1: aconst_null
       2: invokevirtual #52                 // Method doCall:(Ljava/lang/Object;)Ljava/lang/Object;
       5: areturn
       6: aconst_null
       7: areturn

  protected groovy.lang.MetaClass $getStaticMetaClass();
    Code:
       0: aload_0
       1: invokevirtual #61                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
       4: ldc           #2                  // class collectloop$_run_closure1
       6: if_acmpeq     14
       9: aload_0
      10: invokestatic  #65                 // Method org/codehaus/groovy/runtime/ScriptBytecodeAdapter.initMetaClass:(Ljava/lang/Object;)Lgroovy/lang/MetaClass;
      13: areturn
      14: getstatic     #67                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      17: astore_1
      18: aload_1
      19: ifnonnull     34
      22: aload_0
      23: invokevirtual #61                 // Method java/lang/Object.getClass:()Ljava/lang/Class;
      26: invokestatic  #73                 // Method org/codehaus/groovy/reflection/ClassInfo.getClassInfo:(Ljava/lang/Class;)Lorg/codehaus/groovy/reflection/ClassInfo;
      29: dup
      30: astore_1
      31: putstatic     #67                 // Field $staticClassInfo:Lorg/codehaus/groovy/reflection/ClassInfo;
      34: aload_1
      35: invokevirtual #76                 // Method org/codehaus/groovy/reflection/ClassInfo.getMetaClass:()Lgroovy/lang/MetaClass;
      38: areturn
}