为什么无序流比有序流更快?

2023-12-12

我正在阅读 Richard Warburton 所著的 Java 8 书籍,并得出以下结论:

某些操作在有序流上的成本更高。这个问题可以 可以通过消除排序来解决。为此,请调用流的unordered方法。 [...]

我对此感到非常困惑。假设我们有Stream<Integer> stream = Arrays.asList(1, 2, 3, 4).stream();

Since List<Integer>定义流的遭遇顺序 (some) 操作可能执行效率低下。这是为什么?

它如何影响处理以及导致处理速度变慢的原因是什么?为了让事情变得更快,在这种情况下,我们是否应该将其称为

Stream<Integer> stream = Arrays.asList(1, 2, 3, 4).stream().unordered();

?至少可以说,听起来很奇怪......


文档中对此进行了详细解释:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

Ordering
流可能有也可能没有定义的遭遇顺序。无论是否 流的遇到顺序取决于源和 中间操作。某些流源(例如 List 或 数组)本质上是有序的,而其他(例如 HashSet) 不是。一些中间操作,例如sorted(),可能会强加一个 在原本无序的流上遇到顺序,其他人可能会 将有序流渲染为无序,例如 BaseStream.unordered()。 此外,一些终端操作可能会忽略遇到的顺序,例如 forEach()。

如果流是有序的,则大多数操作都被限制为在 元素的遭遇顺序;如果流的源是 包含[1,2,3]的列表,则执行map(x -> x*2)的结果 必须是 [2, 4, 6]。但是,如果源没有定义遭遇 顺序,那么值 [2, 4, 6] 的任何排列都是有效的 结果。 对于顺序流,存在或不存在遭遇顺序 不影响性能,只影响确定性。如果一个流是有序的, 在相同的流管道上重复执行相同的流管道 源将产生相同的结果;如果没有订购, 重复执行可能会产生不同的结果。

对于并行流,放宽排序约束有时可以 实现更高效的执行。某些聚合操作,例如 过滤重复项(distinct())或分组缩减 (Collectors.groupingBy()) 可以更有效地实现,如果 元素的顺序不相关。类似地,操作是 本质上与遇到顺序相关,例如 limit(),可能需要 缓冲以确保正确排序,破坏了好处 并行性。如果流有遇到顺序,但 用户并不特别关心遇到的顺序,明确地 使用 unordered() 对流进行解序可以提高并行性 某些有状态或终端操作的性能。然而,大多数 流管道,例如上面的“块的权重总和”示例, 即使在排序限制下仍然可以有效地并行化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么无序流比有序流更快? 的相关文章

  • 使用 Maven 生成 Eclipse 项目文件

    当我尝试使用生成 Eclipse 项目文件时mvn eclipse eclipse我收到以下错误 插件管理器执行目标时出现内部错误 org apache maven plugins maven eclipse plugin 2 9 SNAP
  • Java 字符串哈希码缓存

    字符串不变性的优点之一是哈希码缓存以实现更快的访问 在这种情况下 如何处理具有相同哈希码的字符串的缓存 在这种情况下它真的能提高性能吗 在这种情况下 如何处理具有相同哈希码的字符串的缓存 被缓存的是字符串的哈希码 它被缓存在私有的int字符
  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • 使用正则表达式验证输入字符串是否为 0-255 之间的数字

    我在将输入字符串与正则表达式匹配时遇到问题 我想验证输入数字在 0 255 之间并且长度最多应为 3 个字符 代码工作正常 但当我输入 000000 至任意长度时 显示 true 而不是 false 这是我的代码 String IP 000
  • jpa2 CriteriaBuilder order by “ORDER BY 表达式必须出现在选择列表中”

    我正在写一个查询标准生成器 但无法添加order by子句 因为它随消息一起抛出错误ORDER BY 表达式必须出现在选择列表中这是我的实体 public class A Integer aId ManyToOne JoinColumn n
  • Java“空白最终字段可能尚未初始化”方法中抛出异常

    我有一些代码 例如 final int var1 if isSomethingTrue var1 123 else throwErrorMethod int var2 var1 throwErrorMethod 的定义如下 private
  • 如何为java注释处理器编写自动化单元测试?

    我正在尝试使用 java 注释处理器 我可以使用 JavaCompiler 编写集成测试 事实上我现在正在使用 hickory 我可以运行编译过程并分析输出 问题 即使我的注释处理器中没有任何代码 单个测试也会运行大约半秒 对于以 TDD
  • EL 通过 Scriptlet

    在 JSP 中使用 EL 相对于 scriptlet 的优势是什么 EL 被认为是无脚本语言 EL 使 JSP 免受容易出错原始 Java 代码并强制您根据 MVC 思想编写 JSP EL 或像 JSTL 这样的标签库 不可能实现的任何事情
  • 全静态方法和应用单例模式有什么区别?

    我正在创建一个数据库来存储有关我的网站用户的信息 我正在使用 stuts2 因此使用 Java EE 技术 对于数据库 我将创建一个 DBManager 我应该在这里应用单例模式还是将其所有方法设为静态 我将使用这个 DBManager 进
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • 如何在 Java 中使用 StringUtils?

    我是 Java 初学者 我想用StringUtils replace但 Eclipse 输出 StringUtils cannot be resolved I tried import java lang 但它不起作用 java lang不
  • spring mvc 跟踪引用页面

    在基于注释的弹簧控制器中 如果用户正在url com first page并点击一个链接或提交一份表格指出url com second page 如何制作second page知道url of first page所以这样second pa
  • SwingWorker 在另一个 SwingWorker 的 did 方法中

    首先 我需要通知您 我正在尽最大努力学习如何用 Java 编写代码 虽然有点困难 但我相信我能做到 我过去提交了几个有关 SwingWorkers 等的问题 每一个我都以为我已经做到了 但后来发现我仍然需要学习 希望这一次不是那样的一次 话
  • org.apache.commons.codec.digest.Md5Crypt.md5Crypt 函数。 linux下出现异常,windows下正常

    我们正在使用commons codec加密密码 使用org apache commons codec digest Md5Crypt md5Crypt功能 在Windows环境下工作正常 但在CentOS上却抛出异常 我们有3台centOS
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr
  • 如何在 Log4j2 - JSON 布局中自定义或删除默认属性

    In Spring Boot 2我已配置的应用程序Log4j2 with JsonLayout像下面这样
  • 使用正则表达式匹配阿拉伯文文本

    我试图使用正则表达式仅匹配阿拉伯语文本 但出现异常 这是我的代码 txt matches P Arabic 这是例外情况 线程 main 中的异常 java util regex PatternSyntaxException 索引 9 附近
  • Retrofit 2.0:预期为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $ [重复] 处为 STRING

    这个问题在这里已经有答案了 我在邮递员上传递了更新用户请求并获得了成功的响应 参见图片 现在当我尝试使用 Retrofit 2 在我的应用程序中执行相同操作时 出现错误 com google gson JsonSyntaxException
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • 如何检查元素是否在屏幕外

    我需要使用 jQuery 检查 DIV 元素是否没有脱离屏幕 这些元素是可见的 并根据 CSS 属性显示 但可以通过以下方式故意将它们放置在屏幕外 position absolute left 1000px top 1000px 我无法使用
  • Jquery .live() 事件在 Firefox 和 IE 上不起作用

    我有现场活动 需要提交并点击
  • Swagger 对象数组

    我在 swagger 方面遇到了一些问题 我在 yaml 文件中以这种方式描述了一组对象 地址 Address properties street type string city type string state type string
  • Bootstrap 3 使用 Javascript 在页面加载时打开下拉菜单

    我似乎无法在页面加载时打开此下拉菜单 有人可以帮忙吗 Bootrap 3 的文档在这里 http getbootstrap com javascript dropdowns 我尝试过 但似乎不起作用 myDropdown dropdown
  • 用于 Javascript 的 .tiff 库

    有没有类似的图书馆画布2图像 请查看createBMP函数 在JavaScript 浏览器或nodejs 中制作 tiff 本机浏览器对 tiff 文件的支持仍然很差 维基百科对浏览器有很好的概述图片格式支持 话虽如此 由于 tiff 图像
  • (未知):#2514:获取脚本时发生未知错误。 [服务人员]

    这是控制台上的内容 unknown 2514 An unknown error occurred when fetching the script Service Workers 当服务工作人员接管或跳过等待并且我在网络关闭的情况下重新加载
  • GnuPlot 中的线图,其中线宽是我的数据文件中的第三列?

    我有一个包含三列的数据文件 1 1 0 1 2 1 5 2 3 0 0 3 4 1 2 2 5 5 1 0 1 6 1 1 5 其中第一列是我的 X 值 第二列是我的 Y 值 第三列是线宽 我希望根据第三列线宽绘制每个线段 I tried
  • 升级到Xcode 10后出现问题:找不到构建输入文件

    我昨晚将 Xcode SDK 升级到版本 10 然后发现无法构建 我收到此错误 找不到构建输入文件 Users call01 Library Developer Xcode DerivedData Comp Lite Apps gytvmo
  • 如何在Python中使用turtle模块播放GIF?

    我想让 GIF 在海龟屏幕上播放 但它只显示静态图像 请解决这个问题 任何帮助将不胜感激 这是我的代码 import turtle import os resources bgpic r C Users intel Desktop xBDT
  • 以编程方式检测 iPhone 中的 Sim 卡是否可用

    您好 我正在使用 SMSComposer 想要从地址簿中向联系人发送短信 我想检测我的 iPhone 中是否有 SIM 卡 我有什么办法可以达到这个目的吗 我尝试了 REachability Classes 但它为您提供了有关 WWAN 和
  • 使用自定义选择颜色和边框创建分组 UITableviewCell

    我目前正在编写一个应用程序 它在分组表视图中使用不同的选择颜色 就边界而言 这非常有效 我可以使用这篇文章中的代码更改选择颜色 如何自定义分组表视图单元格的背景 边框颜色 BUT我还想在苹果使用的单元格周围添加漂亮的边框 我该如何使用这个边
  • 无法安装 HTTPBuilder

    我正在尝试安装HTTPBuilder像这样 Grab group org codehaus groovy modules http builder module http builder version 0 7 2 但是 我收到此错误 ja
  • 如何从像素缓冲区创建 Win32 HBITMAP

    我尝试从像素缓冲区创建 HBITMAP 并显示它 这是我创建 HBITMAP 的代码 char buffer 640 480 3 memset buffer 255 640 480 3 BITMAPINFO bm sizeof BITMAP
  • Django 查询集匹配所有相关对象

    假设我有一个从 Coconut 到 Swallow 的外键 即 一只燕子携带了许多椰子 但每个椰子只被一只燕子携带 现在假设我有一个从 husk segment 到 Coconut 的外键 现在 我有一个 husk segments 列表
  • 整数太大[重复]

    这个问题在这里已经有答案了 嗨 我无法理解为什么这不起作用 if Long parseLong morse 4545454545 System out println 2 其中莫尔斯只是一串数字 问题是它说整数太大 4545454545 但
  • 如何从 CSV 中提取命名列?

    我有一个包含大约 50 列的 csv 文件 但我只需要其中大约 10 列 我希望能够从该 csv 文件中提取所需的列到新的 csv 文件中 这篇文章的最佳答案如何删除 CSV 文件中的列 看起来它会完全满足我的需要 但这是我每天都需要做的事
  • 使用 GET 的 MVC AttributeRouting - 返回 405 - 不允许的方法

    我刚刚在研究一种新的控制器操作方法 我有点困惑为什么会看到 405 我已经在我的 API 上定义了几个 GET 属性方法 它们都按预期运行 举个例子 这工作得很好 GET entries page JsonExceptionFilter p
  • 与绘图线一起创建标签

    我问了一个有关自定义小部件的问题 但对我是否需要它以及应该如何进行感到困惑 我目前有这门课 public class GUIEdge public Node node1 public Node node2 public int weight
  • 从 GCP 连接到 Azure SQL 时出现 NoClassDefFoundError com/microsoft/aad/adal4j/AuthenticationException

    我的 Spark 项目位于 GCP 中的 data proc 上 并在 Spark 提交上运行驱动程序 当我尝试连接到 Azure SQL DB 时 它抛出以下异常 20 39 15 DOCKER Exception in thread m
  • 为什么无序流比有序流更快?

    我正在阅读 Richard Warburton 所著的 Java 8 书籍 并得出以下结论 某些操作在有序流上的成本更高 这个问题可以 可以通过消除排序来解决 为此 请调用流的unordered方法 我对此感到非常困惑 假设我们有Strea