> Originally was proposed by Zheka Kozlov here: 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2018-December/057192.html
> 
> Just a tiny optimization: we can use for-i loop instead of 
> `Iterable.forEach()` which is relying on iterator.
> 
> Simple benchmark demonstrates slight improvement:
> 
> @State(Scope.Thread)
> @BenchmarkMode(Mode.AverageTime)
> @OutputTimeUnit(TimeUnit.NANOSECONDS)
> public class NCopiesBenchmarks {
>   @Param({"10", "50", "100"})
>   int size;
> 
>   private List<Object> list;
> 
>   @Setup
>   public void prepare() {
>     list = Collections.nCopies(size, new Object());
>   }
> 
>   @Benchmark
>   public void forEach(Blackhole bh) {
>     list.forEach(bh::consume);
>   }
> }
> 
> 
> 
> before
> 
> Benchmark                                      (size)  Mode  Cnt    Score    
> Error   Units
> NCopiesBenchmarks.forEach                          10  avgt   50   40.737 ±  
> 1.854   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate           10  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm      10  avgt   50   ≈ 10⁻⁴     
>         B/op
> NCopiesBenchmarks.forEach:·gc.count                10  avgt   50      ≈ 0     
>       counts
> NCopiesBenchmarks.forEach                          50  avgt   50  213.324 ±  
> 3.784   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate           50  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm      50  avgt   50   ≈ 10⁻³     
>         B/op
> NCopiesBenchmarks.forEach:·gc.count                50  avgt   50      ≈ 0     
>       counts
> NCopiesBenchmarks.forEach                         100  avgt   50  443.171 ± 
> 17.919   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate          100  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm     100  avgt   50    0.001 ±  
> 0.001    B/op
> NCopiesBenchmarks.forEach:·gc.count               100  avgt   50      ≈ 0     
>       counts
> 
> after
> 
> Benchmark                                      (size)  Mode  Cnt    Score    
> Error   Units
> NCopiesBenchmarks.forEach                          10  avgt   50   36.838 ±  
> 0.065   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate           10  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm      10  avgt   50   ≈ 10⁻⁴     
>         B/op
> NCopiesBenchmarks.forEach:·gc.count                10  avgt   50      ≈ 0     
>       counts
> NCopiesBenchmarks.forEach                          50  avgt   50  191.173 ±  
> 0.570   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate           50  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm      50  avgt   50   ≈ 10⁻⁴     
>         B/op
> NCopiesBenchmarks.forEach:·gc.count                50  avgt   50      ≈ 0     
>       counts
> NCopiesBenchmarks.forEach                         100  avgt   50  376.675 ±  
> 2.476   ns/op
> NCopiesBenchmarks.forEach:·gc.alloc.rate          100  avgt   50    0.001 ±  
> 0.001  MB/sec
> NCopiesBenchmarks.forEach:·gc.alloc.rate.norm     100  avgt   50    0.001 ±  
> 0.001    B/op
> NCopiesBenchmarks.forEach:·gc.count               100  avgt   50      ≈ 0     
>       counts

Сергей Цыпанов has updated the pull request with a new target base due to a 
merge or a rebase. The incremental webrev excludes the unrelated changes 
brought in by the merge/rebase. The pull request contains four additional 
commits since the last revision:

 - Merge branch 'master' into ncopies
 - 8274715: Add NCopiesBenchmarks.java
 - 8274715: Revert some irrelevant changes
 - 8274715: Implement forEach in Collections.CopiesList

-------------

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/2524/files
  - new: https://git.openjdk.java.net/jdk/pull/2524/files/2303aa72..18f5d589

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=2524&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=2524&range=00-01

  Stats: 1563723 lines in 16632 files changed: 815442 ins; 677273 del; 71008 mod
  Patch: https://git.openjdk.java.net/jdk/pull/2524.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/2524/head:pull/2524

PR: https://git.openjdk.java.net/jdk/pull/2524

Reply via email to