RFR 8037106: Optimize Arrays.asList(...).forEach

Paul Sandoz paul.sandoz at oracle.com
Mon Mar 17 16:36:25 UTC 2014


Hi Sergey,

Thanks, you are right! I did not realize it copied the array into a local variable, but that makes sense.

Here is the byte code generated by javac (9) for two different methods:

    void x() {
        for (Object o : a) {
            System.out.println(o);
        }
    }

         0: aload_0       
         1: getfield      #2                  // Field a:[Ljava/lang/Object;
         4: astore_1      
         5: aload_1       
         6: arraylength   
         7: istore_2      
         8: iconst_0      
         9: istore_3      
        10: iload_3       
        11: iload_2       
        12: if_icmpge     34
        15: aload_1       
        16: iload_3       
        17: aaload        
        18: astore        4
        20: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        23: aload         4
        25: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        28: iinc          3, 1
        31: goto          10
        34: return        


    void y() {
        Object[] a = this.a;
        for (Object o : a) {
            System.out.println(o);
        }
    }

         0: aload_0       
         1: getfield      #2                  // Field a:[Ljava/lang/Object;
         4: astore_1      
         5: aload_1       
         6: astore_2      
         7: aload_2       
         8: arraylength   
         9: istore_3      
        10: iconst_0      
        11: istore        4
        13: iload         4
        15: iload_3       
        16: if_icmpge     39
        19: aload_2       
        20: iload         4
        22: aaload        
        23: astore        5
        25: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
        28: aload         5
        30: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
        33: iinc          4, 1
        36: goto          13
        39: return        

Paul.

On Mar 17, 2014, at 5:07 PM, Sergey Bylokhov <Sergey.Bylokhov at oracle.com> wrote:

> On 3/17/14 7:41 PM, Paul Sandoz wrote:
>> On Mar 15, 2014, at 12:17 AM, Ulf Zibis <Ulf.Zibis at CoSoCo.de> wrote:
>> 
>>> Am 14.03.2014 17:10, schrieb Paul Sandoz:
>>>>> I'm willing to believe for-loop over array is as efficient as fortran-style loop
>>>>> 
>>>>> +            for (E e : a) {
>>>>> +                action.accept(e);
>>>>> +            }
>>>>> 
>>>> Yeah, i previously went through a whole bunch of code replacing such fortran-style loops with 'foreach' style based on automated code analysis.
>>> But wouldn't this help a little more? :
>>> +            final E[] a = this.a;
>>> +            for (E e : a) {
>>> +                action.accept(e);
>>> +            }
>>> 
>> Thanks, i changed it to that.
> ? Why this line is needed:
> final E[] a = this.a;
> Since according to specification foreach over array should be transformed to:
> JLS 14.14.2:
> T[] #a = Expression; 
> L1: L2: ... Lm:
> for (int #i = 0; #i < #a.length; #i++) {
>     VariableModifiersopt TargetType Identifier = #a[#i];
>     Statement
> }
> 
> So your code will be transformed to:
> +            final E[] a = this.a;
> +            E[] #a = a;
> +            for (E e : #a) {
> +                action.accept(e);
> +            }
> Or I miss something?
>>> I more like the given style with less spaces:
>>> 3854                 for (int i=0; i<a.length; i++)
>>> It better visualizes the 3 parts of the for statement.
>>> 
>> Subjectively that irritates my eyes :-) non-subjectively it is inconsistently applied.
>> 
>> Paul.
> 
> 
> -- 
> Best regards, Sergey. 




More information about the core-libs-dev mailing list