RFR: 8274715: Implement forEach in Collections.CopiesList [v2]
Martin Buchholz
martin at openjdk.java.net
Tue Oct 5 17:19:09 UTC 2021
On Tue, 5 Oct 2021 09:18:57 GMT, Сергей Цыпанов <github.com+10835776+stsypanov at 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 pull request now contains four commits:
>
> - Merge branch 'master' into ncopies
> - 8274715: Add NCopiesBenchmarks.java
> - 8274715: Revert some irrelevant changes
> - 8274715: Implement forEach in Collections.CopiesList
Thanks - TIL about Blackhole::consume .
All Java source files should end with exactly one newline. Configure your editor to make it so.
-------------
Changes requested by martin (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/2524
More information about the core-libs-dev
mailing list