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