Stream.toList()的性能将比Collectors.toList()好吗 [英] Would Stream.toList() perform better than Collectors.toList()
问题描述
JDK正在引入API JDK-8180352 .这是一个基准测试代码,我试图将其性能与现有的Collectors.toList
进行比较:
JDK is introducing an API Stream.toList()
with JDK-8180352. Here is a benchmarking code that I have attempted to compare its performance with the existing Collectors.toList
:
@BenchmarkMode(Mode.All)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 20, time = 1, batchSize = 10000)
@Measurement(iterations = 20, time = 1, batchSize = 10000)
public class CollectorsVsStreamToList {
@Benchmark
public List<Integer> viaCollectors() {
return IntStream.range(1, 1000).boxed().collect(Collectors.toList());
}
@Benchmark
public List<Integer> viaStream() {
return IntStream.range(1, 1000).boxed().toList();
}
}
结果摘要如下:
Benchmark Mode Cnt Score Error Units
CollectorsVsStreamToList.viaCollectors thrpt 20 17.321 ± 0.583 ops/s
CollectorsVsStreamToList.viaStream thrpt 20 23.879 ± 1.682 ops/s
CollectorsVsStreamToList.viaCollectors avgt 20 0.057 ± 0.002 s/op
CollectorsVsStreamToList.viaStream avgt 20 0.040 ± 0.001 s/op
CollectorsVsStreamToList.viaCollectors sample 380 0.054 ± 0.001 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.00 sample 0.051 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.50 sample 0.054 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.90 sample 0.058 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.95 sample 0.058 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.99 sample 0.062 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.999 sample 0.068 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p0.9999 sample 0.068 s/op
CollectorsVsStreamToList.viaCollectors:viaCollectors·p1.00 sample 0.068 s/op
CollectorsVsStreamToList.viaStream sample 525 0.039 ± 0.001 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.00 sample 0.037 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.50 sample 0.038 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.90 sample 0.040 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.95 sample 0.042 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.99 sample 0.050 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.999 sample 0.051 s/op
CollectorsVsStreamToList.viaStream:viaStream·p0.9999 sample 0.051 s/op
CollectorsVsStreamToList.viaStream:viaStream·p1.00 sample 0.051 s/op
CollectorsVsStreamToList.viaCollectors ss 20 0.060 ± 0.007 s/op
CollectorsVsStreamToList.viaStream ss 20 0.043 ± 0.006 s/op
当然,对领域专家来说,第一个问题是基准测试程序是否正确?测试类在MacOS上执行.如果需要任何其他详细信息,请告诉我.
Of course, the first question to the domain experts would be if the benchmarking procedure is correct or not? The test class was executed on MacOS. Do let me know for any further details required.
根据我从读数中得出的结论,Stream.toList
的平均时间,吞吐量和采样时间看起来要比Collectors.toList
更好.这种理解正确吗?
Follow-up, as far as I could infer from the readings the average time, throughput, and sampling time of the Stream.toList
looks better than the Collectors.toList
. Is that understanding correct?
推荐答案
Stream::toList
构建在toArray
而不是collect
之上. toArray
中有许多优化措施可能使它比收集更快,尽管这在很大程度上取决于细节.如果流管道(从源到最终的中间操作)为SIZED
,则可以对目标数组进行预调整大小(而不是像toList
收集器所必须的那样潜在地重新分配.)如果管道进一步为SUBSIZED
,则并行执行不仅可以预先调整结果数组的大小,还可以计算每个分片的精确偏移量,因此每个子任务都可以将其结果准确地放置在正确的位置,而无需将中间结果复制到最终结果中.
Stream::toList
is built atop toArray
, not collect
. There are a number of optimizations in toArray
that make it potentially faster than collecting, though this depends heavily on the details. If the stream pipeline (from source through final intermediate operation) is SIZED
, the target array can be presized (rather than potentially reallocating as the toList
collector must do.) If the pipeline is further SUBSIZED
, then parallel executions can not only presize the result array, but can compute exact per-shard offsets so each sub-task can drop its results in exactly the right place, eliminating the need for copying intermediate results into the final result.
因此,根据具体情况,toList
可能比collect
快得多.
So, depending on the details, toList
may well be considerably faster than collect
.
这篇关于Stream.toList()的性能将比Collectors.toList()好吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!