如何使用Java中的Spliterator测试并行处理的性能

时间:2015-08-01 09:53:35

标签: java parallel-processing java-8 spliterator

假设我们获得了一个实现spliterator的数据结构。用于测试使用该分裂器的并行处理是否实际上优于顺序处理的样板代码是什么?

2 个答案:

答案 0 :(得分:4)

要测试分裂器本身,您可以创建顺序和并行流,并通过简单的还原操作以最小的开销减少它。例如:

@Benchmark
public sequential(Blackhole bh) {
    bh.consume(StreamSupport.stream(myContainer.spliterator(), false).reduce((a, b) -> a));
}

@Benchmark
public parallel(Blackhole bh) {
    bh.consume(StreamSupport.stream(myContainer.spliterator(), true).reduce((a, b) -> a));
}

通常,检查并行拆分器是否适用于任何trySplit/tryAdvance/forEachRemaining次调用序列更为关键。在测试速度之前,彻底测试正确性是个好主意。

也许一个好主意是创建更贴近现实生活的测试。想一想如何在生产代码中使用您的数据结构,并创建并行和顺序实现此类实例的测试。这些结果与您的数据结构用户更相关。

答案 1 :(得分:0)

虽然Tagir Valeev's answer已经涵盖了基础知识,但您应该记住以下几点:

并行处理可以更快两个原因

  • 由于内存带宽限制,限制单个核心可以处理的数据结构的庞大规模
  • 管道中的中间/收集器步骤足够昂贵,并行执行它们会分摊并行化开销

后者已经可以在更小的数据结构大小上获得回报,甚至可能还有低效的分裂器行为。

理想情况下,您应该同时测试两者,因为渐近良好的性能并不意味着它在曲线的近端表现良好。