Java性能:For-eaching与Streaming

在for循环中向上或向下计数是最有效的迭代方式吗? 有时答案既不是。 阅读这篇文章,了解不同迭代品种的影响。

迭代性能

关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环,该循环从零开始,然后计数到一些预定义的数字:

private static final int ITERATIONS = 10_000;@Benchmark
public int forUp() {int sum = 0;for (int i = 0; i < ITERATIONS; i++) {sum += i;}return sum;
}

有时,我们遇到一个for循环,该循环以预定的非负值开始,然后递减计数。 这在JDK本身中非常普遍,例如在String类中。 这是通过递减而不是递增来解决先前问题的示例。

@Benchmark
public int forDown() {int sum = 0;for (int i = ITERATIONS; i-- > 0;) {sum += i;}return sum;
}

我认为,这样做的理由是,检查值与零的关系可能比测试值与任何其他任意值的关系更有效。 实际上,我所知道的所有CPU都有机器码指令,可以检查给定值与零的关系。 另一个想法是,上面给出的递减计数习惯似乎只检查一次循环变量(它同时检查值,然后减小它),而不是顶部的常规示例。 我怀疑这对当今高效的JIT编译器影响很小或没有影响,后者将能够像优化第二个迭代一样优化第一个迭代。 当代码在解释模式下运行时可能会产生影响,但是本文中未对此进行检查。

另一种方法是使用
IntStream看起来像这样:

@Benchmark
public int stream() {return IntStream.range(0, ITERATIONS).sum();
}

如果大型迭代需要更高的性能,则只需在流中添加.parallel()运算符就可以使流并行变得相对容易。 本文未对此进行检查。

Graal VM下的性能

在我的笔记本电脑(MacBook Pro,2015年中,2.2 GHz Intel Core i7)上的GraalVM(rc-11,以及GraallVM附带的新C2编译器)下运行这些测试可以得出以下结果:

Benchmark              Mode  Cnt       Score       Error  Units
ForBenchmark.forDown  thrpt    5  311419.166 ±  4201.724  ops/s
ForBenchmark.forUp    thrpt    5  309598.916 ± 12998.579  ops/s
ForBenchmark.stream   thrpt    5  312360.089 ±  8291.792  ops/s

对于流解决方案是最快的解决方案(尽管误差在误差范围内),这可能会让某些人感到意外。

在上一篇文章中 ,我介绍了与传统命令式代码相比,流和声明式编程在代码度量方面的一些优势。 我尚未测试过冷代码段的性能(即,在JIT启动之前)。

聪明的数学

根据数学,我们记得从零开始的连续数字的总和为N *(N + 1)/ 2,其中N是序列中的最高数字。 运行此基准测试:

@Benchmark
public int math() {return ITERATIONS * (ITERATIONS + 1) / 2;
}

使我们的性能比以前的实现提高了1000倍以上:

Benchmark           Mode  Cnt          Score          Error  Units
ForBenchmark.math  thrpt    5  395561077.984 ± 11138012.141  ops/s

迭代次数越多,收益越大。 聪明有时会胜过蛮力。

超快速数据流

使用Speedment HyperStream,可以从数据库中获得类似的性能。 在HyperStream上信息 。

结论

在某些常用的硬件/ JVM上,无论我们在for循环中向上还是向下进行迭代都没有关系。 较新的JVM能够优化流迭代,因此与for循环相比,它们具有同等甚至更好的性能。

在我看来,与for循环相比,流代码通常更具可读性,因此,我相信流在某些将来可能是事实上的迭代发明。

使用Speedment HyperStream可以高性能地流传输数据库内容。

翻译自: https://www.javacodegeeks.com/2019/09/java-performance-for-eaching-vs-streaming.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好用的截图工具

目录 截图软件介绍 神器2——Snipaste PicPick——自带画图 LightShot——自带图床 功能总结 截图软件介绍 参考推荐5个截图工具&#xff08;超好用&#xff09; - 知乎&#xff0c;列出几个好用的截图工具 神器2——Snipaste 超级好用&#xff0c;QQ的功能Snipaste全都有…

Markdown语法与文本内容冲突的解决方案(软件Typora)

背景 使用Typora输入文字后&#xff0c;其中特殊字符自动识别为Markdown语法 解决方式 在使用markdown书写博客时&#xff0c;有可能会出现文本中的字符是markdown语法&#xff0c;那么markdown翻译器就会误将这些符号也翻译成某种功能&#xff0c;就会出现显示错误的情况。…

如何在Flutter(REST API)中进行API调用

在本文中&#xff0c;我们将探讨如何在波动中进行API调用并使用简单的REST API。 在这里查看我在Flutter上的其他一些帖子&#xff1a; Flutter vs React Native 了解Flutter中的BLoC架构 &#xff08;强烈建议&#xff09; 在Flutter中构建ListView&#xff08;RecyclerVi…

sublime关闭左边文件路径快捷键

目录 背景 解决方法 方案一&#xff1a; 方案二&#xff1a; 背景 sublime查看某一文件具体内容&#xff0c;左边文件路径占用一部分空间&#xff0c;影响观看 解决方法 方案一&#xff1a; 使用快捷键&#xff1a;关闭和打开相同&#xff0c;先按 CtrlK&#xff0c;再按…

Typora全局搜素

目录 背景 解决方式 全局文件夹下搜索 方法一 方法二 单一文件下搜索 查找功能 1 查找整个单词 ​2 区分大小写 背景 有时需要在打开的文件夹中所有文件搜索某一单词&#xff0c;有时需要在一个文件下搜索 解决方式 全局文件夹下搜索 方法一 方法二 快捷键&#x…

linux 内存不足杀进程_内存不足:杀死进程或牺牲孩子

linux 内存不足杀进程现在是早上六点。 我清醒地总结了导致我太早唤醒电话的事件顺序。 这些故事开始时&#xff0c;我的电话警报响了。 困倦而脾气暴躁的我检查了电话&#xff0c;看我是否真的疯了以至于无法在凌晨5点设置唤醒警报。 不&#xff0c;这是我们的监视系统&#x…

为什么声明性编码使您成为更好的程序员

在许多情况下&#xff0c;具有功能组成的声明式解决方案提供了优于传统命令式代码的优越代码度量。 阅读本文并了解如何使用具有功能组成的声明性代码成为更好的程序员。 在本文中&#xff0c;我们将仔细研究三个问题示例&#xff0c;并研究用于解决这些问题的两种不同技术&am…

Ubuntu 16.04设置IP、网关、DNS

说明&#xff1a;在网上给的教程上面通常会有这样的一个误导思路&#xff0c;按照配置文件设置后会不生效的问题&#xff0c;甚至没有一点效果&#xff0c;经过排查发现Linux下设置IP这个话题的入口线索应该分为两种&#xff1a;1为Server版&#xff0c;2为Desktop版&#xff0…

eclipse调试NS3

Tips&#xff1a; 1&#xff0c; 安装eclipse时注意选择C开发组件&#xff1b; 环境配置参考&#xff1a;https://www.cnblogs.com/zlcxbb/p/3852810.html 第一步&#xff0c;新建C工程&#xff1b; 第二步&#xff0c;在project explorer中右键属性&#xff0c;如下图&…

高效的企业测试-单元和用例测试(2/6)

在本系列的第一部分中&#xff0c;我们看到了有效测试应满足的一些普遍适用的原则和约束。 在这一部分中&#xff0c;我们将仔细研究代码级单元测试以及组件或用例测试。 单元测试 单元测试验证单个单元&#xff08;通常是类&#xff09;的行为&#xff0c;而忽略或模拟该单元…

sublime text 光标移动行末/行首

背景 使用Sublime有移动至行首与文件首部的需求 解决方式 sublime text没有直接跳转至行首行尾的&#xff0c;因为不能判断哪里是段首和短位。但可以通过连续移动单词的方式快速到达行首或行尾。 快捷键 左键 // 向左移动一个字母 右键 // 向右移动一个字母 ctrl左键 //…

Typora文件快速打开与关闭文件

背景 Typora快速关闭与打开某个文件 快捷键 关闭&#xff1a; Ctrl W 在文件中打开&#xff1a; Contrl O 从相关历史记录中快速打开&#xff1a; Ctrl P 保存&#xff1a;CtrlS 另存为&#xff1a;CtrlShiftS 新建窗口&#xff1a;CtrlN

搜狗输入法更换字体与皮肤

图标上右键-更多-属性设置 效果&#xff1a; 注意&#xff1a;如果是新安装的字体&#xff0c;更换中文字体但其中列表没有显示&#xff0c;可以取消更换字体前面的对钩后&#xff0c;重新选择对钩&#xff0c;此时就显示新的中文字体了

javafx 8u40_JavaFX 8u20天的未来过去(始终在最前面)

javafx 8u40自从我发布有关JavaFX的主题以来已经有很长时间了。 因此&#xff0c;如果您仍在追随&#xff0c;那就太棒了&#xff01; 介绍 在这篇博客文章中&#xff0c;我想写一篇关于从JavaFX 8 update 20开始的非常酷的功能的博客&#xff0c;该功能使您的应用程序始终位于…

如何在内存序列化中使用Java深克隆对象

在我以前的文章中&#xff0c;我解释了深度克隆和浅层克隆之间的区别 &#xff0c; 以及复制构造函数和防御性复制方法比默认的Java克隆更好。 使用复制构造函数和防御性复制方法进行的Java对象克隆当然具有某些优势&#xff0c;但是我们必须显式编写一些代码才能在所有这些方…

手机更换必装软件

手机常用软件 1. 慢慢买 购物软件&#xff0c;复制商品链接&#xff0c;查看商品的历史价格与最低价格走势。并且内含优惠券&#xff0c;帮助省钱 2.清浊 用于清理系统垃圾与应用缓存&#xff0c;比系统自带的清理更加干净

复制网页内容

问题背景&#xff1a; 当网页复制东西时&#xff0c;可能因为某些原因导致无法复制。可以用以下方法解决 解决方法&#xff1a; 1. 按下F12&#xff0c;出现以下内容 2. 依次点击右上角三个点&#xff0c;弹出界面后点击shortcuts 3. 选择首选项后&#xff0c;选中Disable …

spring连接jdbc_在Spring JDBC中添加C3PO连接池

spring连接jdbc连接池是一种操作&#xff0c;其中系统会预先初始化将来要使用的连接。 这样做是因为在使用时创建连接是一项昂贵的操作。 在这篇文章中&#xff0c;我们将学习如何在Spring JDBC中创建C3P0连接池&#xff08;某人没有使用Hibernate&#xff09;。 Pom.xml <…

W10常用快捷键

I 问题背景&#xff1a; 操作电脑总是移动鼠标&#xff0c;比较麻烦。最方便的是操作键盘&#xff0c;完成操作 II 常用快捷键&#xff1a; 浏览器&#xff1a;参考博客Chrome浏览器的便捷使用方式_一只积极向上的小咸鱼的博客-CSDN博客 1 ctrlshift组合按键 Shift键是上档…

插入时间信息

问题描述 在进行文本编辑的时候&#xff0c;往往需要记录当天日期。而Typora等软件没有及时插入时间的快捷方式。 方法 搜狗收入法提供快速记录时间的方式 1. 在中文输入法模式中输入rq&#xff08;汉语拼音日期的首字母&#xff09;&#xff0c;选项卡自动显示今日日期,可…