当前位置: 首页 > 知识库问答 >
问题:

有没有理由不使用Java8的ParallelSort?

施赞
2023-03-14

我读到这个关于Java的arrays.sortarrays.parallelsort之间的区别的问题,后者已经有几年的历史了。让我吃惊的是,只有一个问题提到了使用ParallelSort的任何缺点;也就是说,如果使用大量CPU,加速比就会降低。

假设您不在某种特殊的单线程环境中,是否应该始终选择parallelsort?有什么理由不这样做吗?请注意,上面问题的一个答案提到,如果元素少于4096个,ParallelSort将直接调用Sort

共有1个答案

何安宜
2023-03-14

使用数组有一些缺点。ParallelSort

  • 它使用ForkJoinPool.CommonPool(),并且会与默认情况下使用它的其他函数(例如,流上的Parallel())
  • 线程池Arrays.ParallelSort使用的线程池是不可配置的(仅在全局级别上通过增加公共池线程数量)
  • 它在小数据集上的性能更差(数组通常包含很少的元素,JDK甚至承认,例如,大多数arraylist在它们的整个生存期内都是空的,这为不实例化永远不会填充的数组节省了相当多的内存和CPU时间)

另一个有趣的场景是:假设你实现了一个需要排序的纸牌游戏。它非常容易并行化多个游戏执行,而不是并行化一次运行的排序机制,这可能只占用整个游戏循环的一小部分。您现在失去了一种简单的并行化方法(例如,在遗传算法的上下文中运行游戏时)。

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

编辑:如果给定数组的元素少于4096个,即使arrays.parallelsort切换到普通排序:这完全是为了显示意图--如果可能,您需要一个并行排序,它的意义与调用sort不同。挑剔一点:它确实在小数组上表现更差,因为它必须进行额外的检查,如果数组包含的元素少于4096个,以及一些关于公共池线程计数的其他检查(这当然是可以忽略不计的开销):)。

 类似资料:
  • 我们有一个函数,该函数使用自身内部的非捕获lambda,例如: 现在,lambda实现的功能在其他地方变得需要,因此我将把lambda从提升到全局/命名空间范围。我可以将其保留为lambda,使其成为复制粘贴选项,或者将其更改为适当的函数: 将其更改为适当的函数是微不足道的,但这让我想知道是否有理由不将其保留为lambda?是否有任何理由不在任何地方使用lambda而不是“常规”全局函数?

  • 关于已回答的问题:Java BufferedReader,将InputStream转换为BufferedReader,Java的BufferedReader和InputStreamReader类之间有什么区别? BufferedReader[BR]和InputStreamReader[ISR]都实现了相同的接口。BR拥有ISR拥有的所有方法以及其他方法,包括非常有用的readLine()方法和不那

  • 问题内容: 我指的是模块中的OrderedDict,这是一个有序的字典。 如果它具有可订购的附加功能,我意识到这通常不是必需的,但是即使如此,是否还有缺点?慢一点吗?是否缺少任何功能?我没有看到任何丢失的方法。 简而言之,为什么我 不 总是使用它而不是普通的词典? 问题答案: 是的子类,并且需要更多内存来跟踪键的添加顺序。这不是小事。该实现在幕后增加了第二个,所有键的双向链接列表(这是记住顺序的部

  • 版本: 返回一个,其ID为“z”,偏移量为0,默认区域规则。 返回一个,包含ID“utc”和。 例如,在处理时。在这里,我能发现的唯一区别是它的打印方式不同。 我们正在来回地进行代码审查讨论,所以我想这种冲突并不罕见。 它是一个常量(此外,它的偏移量值(0)甚至被缓存)。 由于缺少区域信息,它的开销少了一点。 在UTC时,不需要考虑夏时制时间或历史变化,就像在任何其他时区一样。 因此,对于我迄今为

  • 问题内容: 对于2015年9月,以下是在Swift中制作单例的确切方法: 然后在其他地方… 没问题。 然后,您可以在整个项目范围内简单地执行以下操作: 传统习语: Model.shared.blah()…在代码库中到处可见 “我的”成语: model.blah()…在代码库中到处可见 因此,这导致一切看上去都很漂亮: (在你的项目中,那些“单变量”将是一些事情,如,,,或任何情况下可能会在您的项目

  • 出于某种原因,我曾经认为是线程不安全的,a-la或,而是通过块包装对的访问,或来实现的。 实际上,是线程安全的(通过原子)。因此,需要注意的是:即使在单个线程中需要一些随机输入,使用也是有意义的,因为内部没有原子读写,没有被编译为锁定指令并发出内存障碍。 而且,由于Java8,本质上是一个单例,它的状态保留在类的某些字段中。因此,方法不是对的访问,而只是静态字段读取,即。e.非常便宜。 我有两个问