我正在阅读this question,以了解Java的 Arrays.sort Arrays.parallelSort 之间的区别,这已经有几年了。令我惊讶的是,只有一个问题提到了使用parallelSort的任何缺点;也就是说,如果您使用大量CPU,则速度会降低。

假设您不在某种专门的单线程环境中,应该总是选择parallelSort吗?有没有理由不这样做?请注意,上述问题的答案之一是,如果元素少于4096个,则parallelSort仍会简单地调用sort

最佳答案

使用Arrays.parallelSort有一些缺点

  • 它使用ForkJoinPool.commonPool()并会与默认情况下使用它的其他函数(例如流中的parallel())进行战斗
  • 线程池Arrays.parallelSort使用的
  • 是不可配置的(仅在全局级别上通过增加公共(public)池线程量)
  • 在较小的数据集上表现较差(数组通常不包含很少的元素,JDK甚至承认,例如,大多数ArrayList stay empty for their whole lifetime可以节省大量内存和CPU时间,因为不实例化永远不会填充的数组)

    还有一个有趣的场景:说出您是否实现了一些需要分类的纸牌游戏。它非常容易并行地并行执行多个游戏执行,而不是并行执行一次运行的排序机制,而排序机制可能只占整个游戏循环的一小部分。您失去了现在进行并行化的简单方法(例如,在遗传算法的背景下运行游戏时)。

    但是,是的,如果碰巧有大数组,并且排序是应用程序运行时的重要部分,请使用Arrays.parallelSort

    编辑:
    并且即使给定数组的元素少于4096,即使Arrays.parallelSort转换为常规排序:这都是为了显示意图-如果可能,您需要并行排序,其含义与调用sort不同。而且要挑剔:在小型阵列上确实确实表现较差,因为它必须进行额外检查,以检查该阵列是否包含少于4096个元素,以及其他一些有关公共(public)池线程数的检查(当然,开销可以忽略不计):) 。

    关于java - 有没有理由不使用Java 8的parallelSort?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56841334/

  • 10-12 18:35