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

Java流API:为什么要区分顺序执行模式和并行执行模式?

湛光华
2023-03-14

从流javadoc:

  1. 顺序流/并行流之间没有功能上的区别。输出从不受执行模式影响。
  2. 由于性能提高,在给定适当的核数和问题大小以证明开销合理的情况下,并行流始终是优选的。
  3. 我们希望编写一次代码并在任何地方运行,而不必关心硬件(毕竟这是Java)

假设这些假设是有效的(有一点元假设没有问题),那么在API中公开执行模式有什么价值呢?

看起来您应该能够声明一个stream,顺序/并行执行的选择应该在下面的一个层中自动处理,可以由库代码或JVM本身作为运行时可用的内核、问题的大小等的函数来处理。

当然,假设并行流也可以在单个核心机器上工作,也许只要总是使用并行流就可以实现这一点。但这真的很难看--当它是默认选项时,为什么在我的代码中有对并行流的显式引用呢?

即使有一个场景,您故意想要硬编码顺序流的使用--为什么没有一个子接口sequentialstream来实现这个目的,而不是使用执行模式开关来污染stream呢?

共有1个答案

孟振
2023-03-14

看起来您应该能够声明一个流,并且顺序/并行执行的选择应该在下面的一个层中自动处理,或者由库代码或者JVM本身作为运行时可用的内核、问题的大小等的函数来处理。

实际情况是:a)流是一个库,没有特殊的JVM魔力;b)您无法真正设计一个足够聪明的库,以自动计算出在这种特定情况下什么是正确的决策。没有一种明智的方法可以估计一个特定函数在不运行它的情况下会有多大的开销--即使您可以检查它的实现,但您不能这样做--现在您要在每个流操作中引入一个基准测试,试图弄清楚并行化它是否值得并行开销的代价。这是不实际的,特别是考虑到您事先也不知道并行开销有多差。

在给定适当的核数和问题大小以证明开销是合理的情况下,并行流总是可取的,这是由于性能的提高。

实际上并不总是这样。有些任务太小了,不值得并行化,而且并行化总是有一些开销。(坦白地说,大多数程序员往往高估了并行性的效用,当它真的会损害性能时,就会随处拍打它。)

基本上,这是一个足够困难的问题,你基本上必须把它推给程序员。

 类似资料:
  • 我已经使用testng并行测试用例执行设置,但我只需要执行一次设置方法。 BeforeClass和BeforeMethod也会针对单个线程执行。但我需要在所有线程之前执行一次方法。 如何通过TestNG设置实现这一点? 测试NG。xml

  • 问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关

  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?

  • 我已经定义了partitioner类,它返回与网格大小相同的executionContext。执行上下文={part3=start=0,part1=start=0,part2=start=0} 日志:-

  • 脚本是一个命令一个命令顺序执行的。 Selenese 本身不支持条件语句(if - else, 等)或循环迭代(for, while, 等)。没有流程控制也可以制作很多有用的测试案例。然而,对于动态内容的功能测试,可能涉及到多个页面,编程逻辑通常是必要的。 如果必须使用流程控制,有以下三种解决方案: 使用 Selenium RC 运行脚本结合客户端库,如:Java 或 PHP 库,利用编程语言的流