RFR: 8274715: Implement forEach in Collections.CopiesList

Сергей Цыпанов github.com+10835776+stsypanov at openjdk.java.net
Mon Oct 4 13:04:23 UTC 2021


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

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

Commit messages:
 - Implement forEach in Collections.CopiesList

Changes: https://git.openjdk.java.net/jdk/pull/2524/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=2524&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8274715
  Stats: 15 lines in 1 file changed: 10 ins; 2 del; 3 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


More information about the core-libs-dev mailing list