FWIW, I've verified the same byte codes on Oracle Java 7 and 8 on Windows 7
(all 64 bit).

Gary

On Mon, Sep 29, 2014 at 1:58 PM, Paul Benedict <pbened...@apache.org> wrote:

> Bytecode output courtesy of Mikael Ståldal:
>
> With standard loop:
>
>   private static boolean contains(org.apache.logging.log4j.Marker,
> org.apache.logging.log4j.Marker...);
>     Code:
>        0: iconst_0
>        1: istore_2
>        2: aload_1
>        3: arraylength
>        4: istore_3
>        5: iload_2
>        6: iload_3
>        7: if_icmpge     29
>       10: aload_1
>       11: iload_2
>       12: aaload
>       13: astore        4
>       15: aload         4
>       17: aload_0
>       18: if_acmpne     23
>       21: iconst_1
>       22: ireturn
>       23: iinc          2, 1
>       26: goto          5
>       29: iconst_0
>       30: ireturn
>
>
> With for-each:
>
>   private static boolean contains(org.apache.logging.log4j.Marker,
> org.apache.logging.log4j.Marker...);
>     Code:
>        0: aload_1
>        1: astore_2
>        2: aload_2
>        3: arraylength
>        4: istore_3
>        5: iconst_0
>        6: istore        4
>        8: iload         4
>       10: iload_3
>       11: if_icmpge     34
>       14: aload_2
>       15: iload         4
>       17: aaload
>       18: astore        5
>       20: aload         5
>       22: aload_0
>       23: if_acmpne     28
>       26: iconst_1
>       27: ireturn
>       28: iinc          4, 1
>       31: goto          8
>       34: iconst_0
>       35: ireturn
>
>
>
> Cheers,
> Paul
>
> On Mon, Sep 29, 2014 at 11:31 AM, Vitaly Davidovich <vita...@gmail.com>
> wrote:
>
>> I think Paul's email already has jmh output.
>>
>> I looked at the generated asm on 7u60 x64 linux, and didn't see any
>> material difference.
>>
>> Paul, have you or anyone else looked at the machine code diffs between
>> the two? Looking at timing is useful, but it's possible to get caught up in
>> noise; the generated assembly should provide more conclusive data on
>> whether any real difference is there or not.
>>
>> On Mon, Sep 29, 2014 at 11:21 AM, Andrew Haley <a...@redhat.com> wrote:
>>
>>> On 09/29/2014 03:29 PM, Paul Benedict wrote:
>>> > Open JDKers, I am forwarding an email to get some clarification. It's
>>> been
>>> > a common understanding that foreach should perform no differently than
>>> the
>>> > equivalent for-loop . However, some fellow developers claim there is a
>>> > noticable difference in their microbenchmarking. Can you help explain
>>> what
>>> > is really going on? It's either the case there is a true difference (a
>>> > result that would surprise me) or the results are within a margin of
>>> error
>>> > that make the results insignificant. Please advise.
>>>
>>> The actual code that such a forEach loop generates is this:
>>>
>>>     private int forLoop(final int[] array) {
>>>         int result = 0;
>>>         int[] a = array;
>>>         int len = a.length;
>>>         for (int i = 0; i < len; i++) {
>>>             int element = a[i];
>>>             result ^= element;
>>>         }
>>>         return result;
>>>     }
>>>
>>> If you get different timings for this one, then the measurements are
>>> suspect.
>>>
>>> Java microbenchmarking is notoriously difficult.  Please try to use
>>> jmh; you'll get better and easier to interpret results.
>>>
>>> Andrew.
>>>
>>>
>>> http://openjdk.java.net/projects/code-tools/jmh/
>>>
>>>
>>
>


-- 
E-Mail: garydgreg...@gmail.com | ggreg...@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Reply via email to