如何在Java中使用拆分器测试并行处理的性能

如何在Java中使用拆分器测试并行处理的性能,java,parallel-processing,java-8,spliterator,Java,Parallel Processing,Java 8,Spliterator,假设我们得到了一个实现拆分器的数据结构。用于测试使用该拆分器的并行处理是否实际优于顺序处理的样板代码是什么?要测试拆分器本身,您可以创建一个顺序和并行流,并以最小的开销通过简单的简化操作进行简化。例如: @Benchmark public sequential(Blackhole bh) { bh.consume(StreamSupport.stream(myContainer.spliterator(), false).reduce((a, b) -> a)); } @Benc

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

要测试拆分器本身,您可以创建一个顺序和并行流,并以最小的开销通过简单的简化操作进行简化。例如:

@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
调用的任何序列是否正常工作。在测试速度之前,最好彻底测试正确性

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

虽然已经介绍了基本知识,但您应该记住以下几点:

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

  • 由于内存带宽限制,数据结构的绝对大小限制了单个内核可以处理的内容
  • 管道中的中间/收集器步骤非常昂贵,因此并行执行它们会分摊并行化开销
后者已经可以在更小的数据结构大小下获得回报,甚至可能是在低效率的拆分器行为下


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

谢谢。认可的。基准测试
来自哪个库?它会整齐地打印带注释方法的持续时间吗?@coderodde,它是。肯定会印出来的。它需要一些学习(研究链接页面上的示例),但它很酷。