绩效工作流_流绩效–您的想法

绩效工作流

上周,我介绍了一些有关Java 8流性能的基准测试结果。 你们和gal足够有兴趣留下一些想法,还有哪些可以介绍。

这就是我所做的,这里是结果。

总览

最后一篇文章的序言也适用于此。 阅读它,以找出所有数字为何撒谎,我如何提出这些数字以及如何复制它们。

我在GitHub上的代码中添加了一个新类CommentOperationsBenchmark ,其中包括本文中讨论的基准。 我还更新了Google电子表格,以包括新的数字。

比较的影响

真好 长期以来一直在说要像Ansi C一样写Java更快(数组而不是列表)。

兔子洞的下一步是…

尝试{for(int i = 0 ;;)做东西; } catch(ex ex ex){等等! }

根本不检查循环,仅捕获异常,非常适合高清像素处理。

混沌实验室

WAT? 人们正在这样做吗?

打破ArrayIndexOotOfBoundsException

public int array_max_forWithException() {int m = Integer.MIN_VALUE;try {for (int i = 0; ; i++)if (intArray[i] > m)m = intArray[i];} catch (ArrayIndexOutOfBoundsException ex) {return m;}
}

也许他们应该停止,因为它看起来并不能改善性能:

以毫秒为单位的运行时间标准化为1'000'000个元素
5万 500'000 1'000'000 5'000'000 10'000'000 50'000'000
array_max_for 0.261 0.261 0.277 0.362 0.347 0.380
array_max_forWithException 0.265 0.265 0.273 0.358 0.347 0.386


看来,用于打破循环的机制没有可衡量的影响。 这是有道理的,因为展开循环可以避免大多数比较,并且引发异常的代价在几微秒的范围内 ,因此比此处发生的情况小几个数量级。

这是假设编译器确实有更多技巧。 也许它在更深层次上理解循环,并且JIT将这两种方法编译为相同的指令。

附带说明一下:看看在循环之后array_max_forWithException如何没有return语句?

事实证明Java编译器可以识别简单的无限循环 。 哇! 因此,它知道具有有限计算的每个代码路径都会返回,而不关心无限的代码路径。

归结为以下内容:

一无所有

public int infiniteLoop() {for(;;);
}

您永远不会停止学习……

作业的影响

[F]或“最大”测试我希望每次迭代更新局部变量都会有一些阻力。 我很好奇是否发现最小值在可比较的时间内运行。

b0b0b0b

这是指所有测试都是在数组或列表上运行的,这些数组或列表的元素等于结构中的索引,即[0,1,2,…,n-1]。 因此,找到最大值确实需要n个分配。

那找到一个只需要分配一次的最小值呢?

以毫秒为单位的运行时间标准化为1'000'000个元素
5万 500'000 1'000'000 5'000'000 10'000'000 50'000'000
array_max_for 0.261 0.261 0.277 0.362 0.347 0.380
array_min_for 0.264 0.260 0.280 0.353 0.348 0.359


不,没有区别。 我的猜测是,由于流水线作业,分配实际上是免费的。

由Khalid Albaih在CC-BY 2.0下发布–视角被我改变了。

由Khalid Albaih在CC-BY 2.0下发布 –视角被我改变了。

拳击的影响

关于拳击有两条评论。

最好看到Integer []实现,以确认对拳击的怀疑。

黏黏的

好吧,让我们这样做。 以下数字显示了int [],Integer []和List <Integer>上的for循环和for-each循环:

以毫秒为单位的运行时间标准化为1'000'000个元素
5万 500'000 1'000'000 5'000'000 10'000'000 50'000'000
array_max_for 0.261 0.261 0.277 0.362 0.347 0.380
array_max_forEach 0.269 0.262 0.271 0.349 0.349 0.356
boxedArray_max_for 0.804 1.180 1.355 1.387 1.306 1.476
boxedArray_max_forEach 0.805 1.195 1.338 1.405 1.292 1.421
list_max_for 0.921 1.306 1.436 1.644 1.509 1.604
list_max_forEach 1.042 1.472 1.579 1.704 1.561 1.629


我们可以清楚地看到,运行时的主要指标是数据结构是包含基元还是对象。 但是将Integer数组包装到列表中会导致额外的速度降低。

Yann Le Tallec也对拳击发表了评论:

intList.stream()。max(Math :: max); 造成不必要的拆箱。
intList.stream()。mapToInt(x-> x).max(); 速度大约是阵列版本的两倍。

扬·勒·塔雷克(Yann Le Tallec)

此声明与我们在上一篇文章中得出的结论一致:尽快对流进行拆箱可提高性能。

只是再次检查:

以ms为单位的运行时间标准化为1'000'000元素(以%为单位的错误)
5万 500'000 1'000'000 5'000'000 10'000'000 50'000'000
boxedArray_max _stream 4.231(43%) 5.715(3%) 5.004(27%) 5.461(53%) 5.307(56%) 5.507(54%)
boxedArray_max _stream_unbox 3.367(<1%) 3.515(<1%) 3.548(2%) 3.632(1%) 3.547(1%) 3.600(2%)
list_max _stream 7.230(7%) 6.492(<1%) 5.595(36%) 5.619(48%) 5.852(45%) 5.631(51%)
list_max _stream_unbox 3.370(<1%) 3.515(1%) 3.527(<1%) 3.668(3%) 3.807(2%) 3.702(5%)


这似乎证实了这一说法。 但是结果看起来非常可疑,因为错误很大。 使用不同的设置反复运行这些基准测试显示了一种模式:

  • 存在两种性能水平,一种是〜3.8 ns / op,一种是〜7.5 ns / op。
  • 未装箱的流只表现更好。
  • 盒装流的单个迭代通常在这两个级别中的任何一个上运行,但很少在其他时间进行。
  • 大多数情况下,行为只会在分支之间改变(即从一组迭代到下一组)。

这一切都令人怀疑我的测试设置存在问题。 听到任何想法的人,我会很有趣。

更新资料

Yann确实有一个想法,并指出了这个有趣的问题和有关StackOverflow的出色答案 。 现在,我最好的猜测是装箱的流可以在未装箱的水平上运行,但可能会因意外的非优化而失败。

硬件的影响

Redditor robi2106在他的“ i5-4310 @ 2Ghz w 8GB DDR2”上运行了500,000个元素的套件。 我将结果添加到电子表格中 。

很难从数据中得出结论。 Robi指出“在这2.5个小时中我也没有停止使用我的系统”,这也许可以解释巨大的误差范围。 他们的平均年龄是我的23倍,平均是我的168倍。 (另一方面,我也继续使用我的系统,但是负载很低。)

如果斜视一下,您可以推断出i5-4310在简单计算上会稍快一些,但在更复杂的计算上会落后一些。 考虑到i7-4800的内核数量是原来的两倍,通常可以达到并行性能。

语言的影响

这与Scala(带有@specialized)相比,会很有趣。

加密货币6

我仍然没有尝试使用Scala,也不想为一个基准测试而努力。 也许经验更丰富或更鲜美的人可以尝试一下?

反射

在解释这些数字时,请记住,这些迭代执行了非常便宜的操作。 上次我们发现,已经很简单的算术运算会导致足够的CPU负载, 几乎完全抵消了迭代机制的差异 。 因此,像往常一样,不要过早优化!

总之,我会说:没有新发现。 但是,我很喜欢与您讨论您的想法,如果您有更多想法,请发表评论。 甚至更好的是,自己尝试一下并发布结果。

翻译自: https://www.javacodegeeks.com/2015/09/stream-performance-your-ideas.html

绩效工作流

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

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

相关文章

C语言访问MCU寄存器的两种方式

点击蓝字关注我们单片机的特殊功能寄存器SFR&#xff0c;是SRAM地址已经确定的SRAM单元&#xff0c;在C语言环境下对其访问归纳起来有两种方法。1、采用标准C的强制类型转换和指针来实现采用标准C的强制转换和指针的概念来实现访问MCU的寄存器&#xff0c;例如:#define DDRB (*…

08_优先队列

08_优先队列 一、优先队列最大优先队列最大优先队列API设计 最小优先队列最小优先队列API设计最小优先队列代码实现 索引优先队列索引优先队列实现思路索引优先队列API设计索引优先队列代码实现 一、优先队列 :::info 普通的队列是一种先进先出的数据结构&#xff0c;元素在队…

Python3实现红黑树[下篇]

Python3实现红黑树[下篇]我写的红黑树的上篇在这里&#xff1a;https://blog.csdn.net/qq_18138105/article/details/105190887 这是我近期看的文章 https://www.cnblogs.com/gcheeze/p/11186806.html 我看了很多关于红黑树删除的文章和博客&#xff0c;介绍得是相当相当的复…

C语言内存泄露很严重,如何应对?

点击蓝字关注我们1. 前言最近部门不同产品接连出现内存泄漏导致的网上问题&#xff0c;具体表现为单板在现网运行数月以后&#xff0c;因为内存耗尽而导致单板复位现象。**一方面&#xff0c;内存泄漏问题属于低级错误&#xff0c;此类问题遗漏到现网&#xff0c;影响很坏&…

python发送邮件outlook_通过Python发送Outlook电子邮件?

I am using Outlook 2003. What is the best way to send email (through Outlook 2003) using Python? 解决方案 For a solution that uses outlook see TheoretiCALs answer below. Otherwise, use the smtplib that comes with python. Note that this will require your e…

C++队列queue用法详解(超详细)

点击蓝字关注我们一、定义queue是一种容器转换器模板&#xff0c;调用#include< queue>即可使用队列类。二、queue初始化queue<Type, Container> (<数据类型&#xff0c;容器类型>&#xff09;初始化时必须要有数据类型&#xff0c;容器可省略&#xff0c;省…

python随机抽取人名_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,再也不用担心背单词啦...

&#xfeff;已经完成了利用python爬虫实现定时QQ邮箱推送英文文章&#xff0c;辅助学习英语的项目&#xff0c;索性就一口气利用python多做一些自动化辅助英语学习的项目&#xff0c;对自己的编程能力和英文水评也有一定的帮助&#xff0c;于是在两天的努力下&#xff0c;我完…

用不到125行C语言代码就可以编写一个简单的16位虚拟机?

点击蓝字关注我们一位国外的软件工程师分享了这么一篇博文&#xff1a;Writing a simple 16 bit VM in less than 125 lines of C&#xff08;用不到 125 行 C 语言编写一个简单的 16 位虚拟机&#xff09;。博文地址&#xff1a;https://www.andreinc.net/2021/12/01/writing-…

用一个程序生成另一个程序_还有另一个报告生成器?

用一个程序生成另一个程序如果您具有业务应用程序开发的经验&#xff0c;那么很可能会遇到要求该应用程序具有灵活的报告机制的需求。 我工作的公司主要专注于开发业务解决方案&#xff0c;而报告是必不可少的&#xff0c;实际上&#xff0c;它必须包含我们开发的所有企业系统的…

CocosCreator1.x实现水流动的效果

CocosCreator1.x实现水流动的效果Cocos Creator版本&#xff1a;1.10.2 运行结果&#xff1a;(H5和原生都支持) 场景: 脚本&#xff1a; HelloWorld.js&#xff1a; let shader require(shader);cc.Class({extends: cc.Component,properties: {water: cc.Node,waterNorm…

python爬虫xpath教程_使用 Xpath 进行爬虫开发

使用 Xpath 进行爬虫开发 Xpath( XML Path Language, XML路径语言)&#xff0c;是一种在 XML 数据中查找信息的语言&#xff0c;现在&#xff0c;我们也可以使用它在 HTML 中查找需要的信息。 既然谈到 Xpath 是一门语言&#xff0c;当然它就会有自己的一些特定的语法。我们这里…

用C语言写烟花,给心中的那个人看!

点击蓝字关注我们前言程序员不懂浪漫? 大错特错&#xff01;今天就让你们看看什么是程序员的浪漫&#xff01;你向窗外看烟花&#xff0c;我在窗边看你&#xff0c;这时&#xff0c;你比烟花好看的多&#xff0c;你的眼眸倒映满天的烟火&#xff0c;我的瞳孔倒映你温柔的脸庞…

手把手教你做一个线程池--C语言版

点击蓝字关注我们1、线程池原理我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低…

oracle 48小时内_缺血性脑梗死后48小时内使用阿替普酶能够降低脑损伤程度

一项刊登在影响因子7.6杂志Neurology上题为“Effect of IV alteplase on the ischemic brain lesion at 24–48 hours after ischemic stroke”的研究报告中&#xff0c;来自爱丁堡大学的科学家们发现&#xff0c;alteplase与病变可视性的短期进展降低相关。在荟萃分析中&#…

MySQL夺命16问,你能坚持到第几问?

点击蓝字关注我们1、数据库三大范式是什么&#xff1f;第一范式&#xff1a;每个列都不可以再拆分。第二范式&#xff1a;在第一范式的基础上&#xff0c;非主键列完全依赖于主键&#xff0c;而不能是依赖于主键的一部分。第三范式&#xff1a;在第二范式的基础上&#xff0c;非…

美图手机投射功能在哪_在Java 8中进行投射(还有其他功能?)

美图手机投射功能在哪将实例转换为设计不良的类型。 尽管如此&#xff0c;在某些情况下没有其他选择。 从第一天开始&#xff0c;执行此功能就已成为Java的一部分。 我认为Java 8提出了对这种古老技术稍加改进的需求。 静态铸造 Java中最常见的转换方法如下&#xff1a; 静态…

js箭头函数和普通函数区别

js箭头函数和普通函数区别实验环境&#xff1a;nodejs v12.16.1 箭头函数不能作为构造函数&#xff0c;而普通函数可以 箭头函数没有原型&#xff0c;而普通函数有 箭头函数return可以省略语句块。(如果>右边不是语句块&#xff0c;则代表return右边的表达式或对象) 箭…

git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)

该文章用于记录一些GitLab的使用指南&#xff0c;以及在实际版本控制过程中遇到的问题及解决方法&#xff0c;会尽量及时的更新~GitLab简介&#xff1a;GitLab和GitHub很相似都属于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来…

记一次开发实战-对提供接口的C/C++进行二次开发

点击蓝字关注我们一、需求描述我有一个USB5538的库和头文件&#xff0c;并通过头文件提供了接口&#xff0c;我想把它更改一下&#xff0c;编译成python可调用的模块。二、创建工程及其目录1、创建空项目2、创建目录三、创建文件1、复制文件并添加2、添加新文件并写入四、环境配…

C++是如何实现多态的

C是如何实现多态的结论&#xff1a;C通过虚函数来实现多态的&#xff0c;根本原因是派生类和基类的虚函数表的不同。 构成多态的必要条件有如下3点&#xff1a; 存在继承关系基类存在虚函数&#xff0c;且派生类有相同原型的函数遮蔽它存在基类类型的指针指向派生类对象&…