[ https://issues.apache.org/jira/browse/GROOVY-11632?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Oscar N updated GROOVY-11632: ----------------------------- Description: Using the += or << operators to add to a collection involves calls to DGM methods and an indy call to cast. Having these operators directly call Collection#add() when no extension methods are registered would avoid some overhead and further improve @POJO support. {code:groovy} @CompileStatic final class ListDeclaration { static void main(String[] args) { var list = [] list += "Hello" list << "World" println list } } {code} {code:java} // access flags 0x89 public static varargs main([Ljava/lang/String;)V L0 LINENUMBER 6 L0 NEW java/util/ArrayList DUP INVOKESPECIAL java/util/ArrayList.<init> ()V ASTORE 1 L1 LINENUMBER 7 L1 ALOAD 1 LDC "Hello" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.plus (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; INVOKEDYNAMIC cast(Ljava/util/List;)Ljava/util/ArrayList; [ // handle kind 0x6 : INVOKESTATIC org/codehaus/groovy/vmplugin/v8/IndyInterface.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;I)Ljava/lang/invoke/CallSite; // arguments: "()", 0 ] ASTORE 1 L2 LINENUMBER 8 L2 ALOAD 1 LDC "World" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.leftShift (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; POP L3 LINENUMBER 9 L3 LDC LListDeclaration;.class ALOAD 1 INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println (Ljava/lang/Object;Ljava/lang/Object;)V ACONST_NULL POP L4 LINENUMBER 10 L4 RETURN LOCALVARIABLE args [Ljava/lang/String; L0 L4 0 LOCALVARIABLE list Ljava/util/ArrayList; L1 L4 1 MAXSTACK = 2 MAXLOCALS = 2 {code} was: Using the += or << operators to add to a collection involves calls to DGM methods and an indy call to the cast() metamethod. Having these operators directly call Collection#add() when no extension methods are registered would avoid some overhead and further improve @POJO support. {code:groovy} @CompileStatic final class ListDeclaration { static void main(String[] args) { var list = [] list += "Hello" list << "World" println list } } {code} {code:java} // access flags 0x89 public static varargs main([Ljava/lang/String;)V L0 LINENUMBER 6 L0 NEW java/util/ArrayList DUP INVOKESPECIAL java/util/ArrayList.<init> ()V ASTORE 1 L1 LINENUMBER 7 L1 ALOAD 1 LDC "Hello" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.plus (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; INVOKEDYNAMIC cast(Ljava/util/List;)Ljava/util/ArrayList; [ // handle kind 0x6 : INVOKESTATIC org/codehaus/groovy/vmplugin/v8/IndyInterface.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;I)Ljava/lang/invoke/CallSite; // arguments: "()", 0 ] ASTORE 1 L2 LINENUMBER 8 L2 ALOAD 1 LDC "World" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.leftShift (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; POP L3 LINENUMBER 9 L3 LDC LListDeclaration;.class ALOAD 1 INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println (Ljava/lang/Object;Ljava/lang/Object;)V ACONST_NULL POP L4 LINENUMBER 10 L4 RETURN LOCALVARIABLE args [Ljava/lang/String; L0 L4 0 LOCALVARIABLE list Ljava/util/ArrayList; L1 L4 1 MAXSTACK = 2 MAXLOCALS = 2 {code} > Optimise bytecode for list addition > ----------------------------------- > > Key: GROOVY-11632 > URL: https://issues.apache.org/jira/browse/GROOVY-11632 > Project: Groovy > Issue Type: Improvement > Affects Versions: 5.0.0-alpha-12 > Reporter: Oscar N > Priority: Minor > > Using the += or << operators to add to a collection involves calls to DGM > methods and an indy call to cast. Having these operators directly call > Collection#add() when no extension methods are registered would avoid some > overhead and further improve @POJO support. > {code:groovy} > @CompileStatic > final class ListDeclaration { > static void main(String[] args) { > var list = [] > list += "Hello" > list << "World" > println list > } > } > {code} > {code:java} > // access flags 0x89 > public static varargs main([Ljava/lang/String;)V > L0 > LINENUMBER 6 L0 > NEW java/util/ArrayList > DUP > INVOKESPECIAL java/util/ArrayList.<init> ()V > ASTORE 1 > L1 > LINENUMBER 7 L1 > ALOAD 1 > LDC "Hello" > INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.plus > (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; > INVOKEDYNAMIC cast(Ljava/util/List;)Ljava/util/ArrayList; [ > // handle kind 0x6 : INVOKESTATIC > > org/codehaus/groovy/vmplugin/v8/IndyInterface.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;I)Ljava/lang/invoke/CallSite; > // arguments: > "()", > 0 > ] > ASTORE 1 > L2 > LINENUMBER 8 L2 > ALOAD 1 > LDC "World" > INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.leftShift > (Ljava/util/List;Ljava/lang/Object;)Ljava/util/List; > POP > L3 > LINENUMBER 9 L3 > LDC LListDeclaration;.class > ALOAD 1 > INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println > (Ljava/lang/Object;Ljava/lang/Object;)V > ACONST_NULL > POP > L4 > LINENUMBER 10 L4 > RETURN > LOCALVARIABLE args [Ljava/lang/String; L0 L4 0 > LOCALVARIABLE list Ljava/util/ArrayList; L1 L4 1 > MAXSTACK = 2 > MAXLOCALS = 2 > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)