On Tue, 5 Oct 2021 09:18:57 GMT, Сергей Цыпанов <github.com+10835776+stsypa...@openjdk.org> wrote:
>> 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 Done ------------- PR: https://git.openjdk.java.net/jdk/pull/2524