> 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