It's important to note that our experiments show that the byte codes are
different.

Gary

On Mon, Sep 29, 2014 at 10:29 AM, Paul Benedict <pbened...@apache.org>
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.
>
> Cheers,
> Paul
>
> ---------- Forwarded message ----------
> From: Remko Popma <remko.po...@gmail.com>
> Date: Fri, Sep 26, 2014 at 8:43 AM
> Subject: Re: No for each loop comment?
> To: Log4J Developers List <log4j-...@logging.apache.org>
>
>
> On Windows it looks like normal for loops are slightly faster than
> for-each loops, especially for small arrays of primitives. This could be
> noise, since we are talking about 5 nanoseconds where the baseline (an
> empty method invocation) is 12 nanos.
>
> On Solaris 10 and Red Hat Enterprise Linux the baseline is so large (255
> nanos and 1910 nanos respectively) that any difference we are seeing is
> just noise.
>
> All benchmarks were run with one fork, one thread, 10 warmup iterations
> and 10 test iterations.
>
> *Windows 7 (64bit) with Java 1.8.0_05, 2-core Intel i5-3317u CPU @1.70Ghz
> with hyperthreading switched on (4 virtual cores)*
> Benchmark                                                Mode  Samples
>  Score  Score error  Units
> o.a.l.l.p.j.LoopsBenchmark.baseline                    sample   154947
> 12.432        0.550  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForEachLoop    sample   126597
> 2759.592        3.431  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForLoop        sample   126494
> 2761.729        3.127  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForEachLoop     sample   154124
>  292.880        1.065  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForLoop         sample   156155
>  288.751        1.101  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForEachLoop      sample   191980
> 41.826        0.870  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForLoop          sample   193770
> 36.894        0.782  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForEachLoop       sample   190847
> 22.393        0.618  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForLoop           sample   192552
> 17.146        0.560  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForEachLoop    sample   173839
>  31959.057       14.341  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForLoop        sample   171137
>  32461.985       14.353  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForEachLoop     sample    97495
> 3591.200        4.852  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForLoop         sample   101560
> 3445.998        4.010  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForEachLoop      sample   102796
>  438.207        1.923  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForLoop          sample   102333
>  439.576        2.139  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForEachLoop       sample   113924
> 58.957        1.247  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForLoop           sample   120416
> 60.712        1.284  ns/op
>
>
> // For loops for Object arrays are similar but return the total XOR of the
> element hashcodes.
>
> private int forEachLoop(final int[] array) {
>     int result = 0;
>     for (final int element : array) {
>         result ^= element;
>     }
>     return result;
> }
>
> private int forLoop(final int[] array) {
>     int result = 0;
>     for (int i = 0; i < array.length; i++) {
>         result ^= array[i];
>     }
>     return result;
> }
>
>
>
> *Solaris 10 (64bit) with JDK1.7.0_06-b24 (Oracle Hotspot), 2 quad-core
> Xeon X5570 dual CPUs @2.93Ghz with hyperthreading switched on (16 virtual
> cores)*
> Benchmark                                                Mode  Samples
>  Score  Score error  Units
> o.a.l.l.p.j.LoopsBenchmark.baseline                    sample   110212
>  255.300        0.201  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForEachLoop    sample   187808
> 3938.055        1.207  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForLoop        sample   187897
> 3937.929        0.748  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForEachLoop     sample   123989
>  606.631        0.626  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForLoop         sample   123973
>  609.565        0.416  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForEachLoop      sample   126933
>  294.204        0.280  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForLoop          sample   127070
>  296.411        0.223  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForEachLoop       sample   113400
>  261.519        0.181  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForLoop           sample   111637
>  260.435        0.115  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForEachLoop    sample   115872
>  48154.673       18.846  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForLoop        sample   116777
>  47793.868       17.615  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForEachLoop     sample   138432
> 5256.767        2.451  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForLoop         sample   136644
> 5325.377        2.388  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForEachLoop      sample   166653
>  773.541        0.330  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForLoop          sample   166570
>  774.513        0.574  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForEachLoop       sample   178754
>  317.232        0.134  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForLoop           sample   180165
>  316.189        0.238  ns/op
>
> *64 bit RHEL 6.5 (Linux 2.6.32-431.el6.x86_64) with JDK1.7.0_05-b06
> (Oracle Hotspot), 4 quad-core Xeon X5570 CPUs @2.93GHz with hyperthreading
> switched on (16 virtual cores)*
> Benchmark                                                Mode  Samples
>  Score  Score error  Units
> o.a.l.l.p.j.LoopsBenchmark.baseline                    sample   114783
> 1910.576       29.256  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForEachLoop    sample   194584
> 5132.885       25.137  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10000ForLoop        sample   196672
> 4811.572       52.072  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForEachLoop     sample   133119
> 1967.213       28.970  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray1000ForLoop         sample   133804
> 2004.501       31.554  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForEachLoop      sample   142439
> 1575.329        6.457  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray100ForLoop          sample   142215
> 1957.714       27.815  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForEachLoop       sample   130826
> 1980.301       30.818  ns/op
> o.a.l.l.p.j.LoopsBenchmark.intArray10ForLoop           sample   132654
> 1589.120        8.449  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForEachLoop    sample   126947
>  43301.320       50.589  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10000ForLoop        sample   126117
>  43574.129       55.272  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForEachLoop     sample   143697
> 5831.250       19.667  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray1000ForLoop         sample   163244
> 4823.096       13.180  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForEachLoop      sample   162502
> 1930.819       24.136  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray100ForLoop          sample   171619
> 1625.806       10.385  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForEachLoop       sample   172226
> 1888.683       22.554  ns/op
> o.a.l.l.p.j.LoopsBenchmark.objArray10ForLoop           sample   188838
> 1581.979        6.322  ns/op
>
>
>
>
> On Fri, Sep 26, 2014 at 2:56 AM, Matt Sicker <boa...@gmail.com> wrote:
>
>> The foreach over an array looks like it's supposed to compile to the same
>> thing:
>>
>> https://jcp.org/aboutJava/communityprocess/jsr/tiger/enhanced-for.html
>>
>> Same goes for .length which is supposed to be a final field which would
>> allow for inlining by the JIT I'd imagine (hence why we use final
>> everywhere):
>>
>> http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.7
>>
>>
>>>>> On 24 September 2014 22:12, Gary Gregory <garydgreg...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> Why does this "//noinspection ForLoopReplaceableByForEach" comment
>>>>>> mean?
>>>>>>
>>>>>> Why not for an enhanced for each loop?
>>>>>>
>>>>>>  private static boolean contains(final Marker parent, final Marker...
>>>>>> localParents) {
>>>>>>             //noinspection ForLoopReplaceableByForEach
>>>>>>             for (int i = 0, localParentsLength = localParents.length;
>>>>>> i < localParentsLength; i++) {
>>>>>>                 final Marker marker = localParents[i];
>>>>>>                 if (marker == parent) {
>>>>>>                     return true;
>>>>>>                 }
>>>>>>             }
>>>>>>             return false;
>>>>>>         }
>>>>>>
>>>>>> Thanks,
>>>>>> Gary
>>>>>>
>>>>>>
>>>>>>


-- 
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