java单循环 比较得分_java – 为什么两个单独的循环比一个快?
我想了解Java对连续循环做了什么样的优化。更确切地说,我正在尝试检查是否执行了循环融合。
从理论上讲,我期望这种优化不会自动完成,并且期望确认融合版本比具有两个循环的版本更快。
但是,在运行基准测试之后,结果显示两个独立(和连续)循环比完成所有工作的单个循环更快。
我已经尝试使用JMH创建基准测试并获得相同的结果。
我使用了javap命令,它显示生成的具有两个循环的源文件的字节码实际上对应于正在执行的两个循环(没有循环展开或执行其他优化)。
为BenchmarkMultipleLoops.java测量的代码:
private void work() {
List intermediate = new ArrayList<>();
List res = new ArrayList<>();
int totalLength = 0;
for (Capsule c : caps) {
if(c.getNumber() > 100000000){
intermediate.add(c);
}
}
for (Capsule c : intermediate) {
String s = "new_word" + c.getNumber();
res.add(s);
}
//Loop to assure the end result (res) is used for something
for(String s : res){
totalLength += s.length();
}
System.out.println(totalLength);
}
正在测量BenchmarkSingleLoop.java的代码:
private void work(){
List res = new ArrayList<>();
int totalLength = 0;
for (Capsule c : caps) {
if(c.getNumber() > 100000000){
String s = "new_word" + c.getNumber();
res.add(s);
}
}
//Loop to assure the end result (res) is used for something
for(String s : res){
totalLength += s.length();
}
System.out.println(totalLength);
}
这是Capsule.java的代码:
public class Capsule {
private int number;
private String word;
public Capsule(int number, String word) {
this.number = number;
this.word = word;
}
public int getNumber() {
return number;
}
@Override
public String toString() {
return "{" + number +
", " + word + '}';
}
}
caps是ArrayList< Capsule>在开头填充了这样的2000万个元素:
private void populate() {
Random r = new Random(3);
for(int n = 0; n < POPSIZE; n++){
int randomN = r.nextInt();
Capsule c = new Capsule(randomN, "word" + randomN);
caps.add(c);
}
}
在测量之前,执行预热阶段。
我将每个基准测试运行了10次,换句话说,每个基准测试执行work()方法10次,完成的平均时间如下(以秒为单位)。每次迭代后,GC都会执行几次睡眠:
> MultipleLoops:4.9661秒
> SingleLoop:7.2725秒
OpenJDK 1.8.0_144在Intel i7-7500U(Kaby Lake)上运行。
为什么MultipleLoops版本比SingleLoop版本更快,即使它必须遍历两个不同的数据结构?
更新1:
正如评论中所建议的那样,如果我在生成字符串时更改实现以计算totalLength,从而避免创建res列表,则单循环版本会变得更快。
但是,只引入了该变量,以便在创建结果列表后完成一些工作,以避免在没有对它们进行任何操作时丢弃这些元素。
换句话说,预期的结果是产生最终列表。但这个建议有助于更好地了解正在发生的事情。
结果:
> MultipleLoops:0.9339秒
> SingleLoop:0.66590005秒
更新2:
结果:
> MultipleLoops:7.397秒
> SingleLoop:8.092秒
java单循环 比较得分_java – 为什么两个单独的循环比一个快?相关推荐
- java中怪物移动_java中两大怪物,附带面试题!
最近老是有小伙伴问类和Object相关的问题,感觉还是很多人对此不是很明白,那我们今天就干掉这两个怪物. 类介绍 Java 程序是由若干个类组成的,类也是面向对象编程思想的具体实现. 以下为类的定义: ...
- java判断总共天数_Java判断两个日期相差天数的方法
本文实例讲述了Java判断两个日期相差天数的方法.分享给大家供大家参考.具体如下: import java.util.Calendar; public class DateDifferent{ pub ...
- java 圆的交点_java求两个圆相交坐标
最近由于项目需要,根据两个圆函数求出相交的坐标.实现代码如下,另感谢两圆求交点算法实现Java代码,虽然他所贡献的代码中存在问题,但仍有借鉴意义. 1.两个圆相交的数学求法 在中学数学中我们知道,一个 ...
- java小数点默认定义_java求两个数后小数点默认无限长度
闲来没事,写个求两个数相除,想看看后面的小数,此算法可快速算出小数点后千万位. import java.io.BufferedWriter; import java.io.File; import j ...
- java 图片相似搜索_java获取两张图片的相似度
package com.sinosoft.lis.utils; import java.awt.Graphics2D; import java.awt.color.ColorSpace; import ...
- java 图片相似搜索_JAVA比较两张图片相似度的方法
本文实例讲述了JAVA比较两张图片相似度的方法.分享给大家供大家参考.具体如下: 摘要: importjava.awt.image.BufferedImage; importjava.io.File; ...
- java判断list相等_java 判断两个list是否相等
/** * 队列比较 * @param * @param a * @param b * @return */ public static > boolean compare(List a, Li ...
- java判断总共天数_java判断两个时间相差得天数
方法一:通过Calendar类得日期比较,在这需要考虑闰年和平年,也要考虑跨年份 /** * date2比date1多的天数 * @param date1 * @param date2 * @retu ...
- java求最大子串_Java获取两个字符串中最大相同子串的方法
"abcwerthelloyuiodef" "cvhellobnm" 思路: 1,将短的那个子串按照长度递减的方式获取到. 2,将每获取到的子串去长串中判断是否 ...
最新文章
- 如何用jsp在线自动批改_推荐:5个好用的免费自动化在线营销工具
- ms project(第一篇笔记)
- 2017-2018-20172309 《程序设计与数据结构》第八周学习总结
- mongodb 持久化 mysql_(转)mongodb与mysql区别
- SegmentFault D-Day 2015 武汉站回顾
- BROTHER 废墨清零教学
- android 支付宝手势密码锁,Android仿支付宝手势密码解锁功能
- QQ定时发消息vbs代码
- web标准和w3c_W3C记录了Web的体系结构
- 互联网B端产品设计经验总结
- 终端安全检测与防御技术
- 电脑死机故障解决方法全面汇总
- 牛客小白月赛25 C.白魔法师
- 在web前段,最挣扎的问题尽然是单词!
- JSON解释及语法规则
- 只需三步,教你搭建一个进销存管理系统!
- Python打包文件到exe 修改图标 优化启动速度
- 通过ve模板实现一键在线视频制作
- word课程表设置符号与编号_用WORD设计一个课程表 ,标题使用艺术字生成 ,要包含合并单元格、边框、底纹、字体样式、背景图片,包含自己的学号和姓名。提交到锦城在线上。_学小易找答案...
- 使用javascript计算1加到100的结果