【问题标题】:How to test the performance of parallel processing with Spliterators in Java如何在 Java 中使用 Spliterators 测试并行处理的性能
【发布时间】:2015-10-23 23:32:06
【问题描述】:

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

【问题讨论】:

    标签: java parallel-processing java-8 spliterator


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。公认。 Benchmark 来自哪个库?它会整齐地打印带注释的方法的持续时间吗?
    • @coderodde,它是JMH。肯定会打印的。它需要一些学习(研究链接页面上的示例),但它很酷。
    【解决方案2】:

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

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

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

    后者已经可以在更小的数据结构尺寸上获得回报,甚至可能使用低效的拆分器行为。

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

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多