3

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

4

2 回答 2

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调用序列更为关键。在测试速度之前,最好彻底测试一下正确性。

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

于 2015-08-01T10:00:12.677 回答
0

虽然Tagir Valeev 的回答已经涵盖了基础知识,但您应该牢记以下几点:

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

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

后者已经可以在更小的数据结构大小甚至可能是低效的拆分器行为上得到回报。

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

于 2015-08-01T13:35:38.090 回答