循环内的局部变量和性能

总览

有时会出现一个问题,即分配一个新的局部变量需要花费多少工作。 我的感觉一直是,代码已优化到成本为静态的程度,即一次执行,而不是每次运行时都执行。

最近, Ishwor Gurung建议考虑将一些局部变量移出循环。 我怀疑这不会有所作为,但我从未测试过是否确实如此。

考试

这是我运行的测试:

public static void main(String... args) {for (int i = 0; i < 10; i++) {testInsideLoop();testOutsideLoop();}
}private static void testInsideLoop() {long start = System.nanoTime();int[] counters = new int[144];int runs = 200 * 1000;for (int i = 0; i < runs; i++) {int x = i % 12;int y = i / 12 % 12;int times = x * y;counters[times]++;}long time = System.nanoTime() - start;System.out.printf("Inside: Average loop time %.1f ns%n", (double) time / runs);
}private static void testOutsideLoop() {long start = System.nanoTime();int[] counters = new int[144];int runs = 200 * 1000, x, y, times;for (int i = 0; i < runs; i++) {x = i % 12;y = i / 12 % 12;times = x * y;counters[times]++;}long time = System.nanoTime() - start;System.out.printf("Outside: Average loop time %.1f ns%n", (double) time / runs);
}

输出以以下结尾:

内部 :平均循环时间3.6 ns
:平均循环时间3.6 ns
内部 :平均循环时间3.6 ns :平均循环时间3.6 ns

将测试时间增加到1亿次迭代,对结果的影响很小。

内部 :平均循环时间3.8 ns
:平均循环时间3.8 ns
内部 :平均循环时间3.8 ns :平均循环时间3.8 ns

>>, &, + I代替模和乘法

int x = i & 15;
int y = (i >> 4) & 15;
int times = x + y;

版画

内部 :平均循环时间1.2 ns
:平均循环时间1.2 ns
内部 :平均循环时间1.2 ns :平均循环时间1.2 ns

尽管模量相对昂贵,但测试的分辨率为0.1 ns或小于时钟周期的1/3。 这将显示两次测试之间的任何差异,以达到此精度。

使用卡尺

正如@maaartinus所评论的那样, Caliper是一个微基准测试库,因此我对手工编写代码可能会慢得多感兴趣。

public static void main(String... args) {Runner.main(LoopBenchmark.class, args);
}public static class LoopBenchmark extends SimpleBenchmark {public void timeInsideLoop(int reps) {int[] counters = new int[144];for (int i = 0; i < reps; i++) {int x = i % 12;int y = i / 12 % 12;int times = x * y;counters[times]++;}}public void timeOutsideLoop(int reps) {int[] counters = new int[144];int x, y, times;for (int i = 0; i < reps; i++) {x = i % 12;y = i / 12 % 12;times = x * y;counters[times]++;}}
}

首先要注意的是,代码较短,因为它不包括计时和印刷样板代码。 运行此程序,我将与第一个测试使用同一台计算机。

0% Scenario{vm=java, trial=0, benchmark=InsideLoop} 4.23 ns; σ=0.01 ns @ 3 trials
50% Scenario{vm=java, trial=0, benchmark=OutsideLoop} 4.23 ns; σ=0.01 ns @ 3 trialsbenchmark   ns linear runtime
InsideLoop 4.23 ==============================
OutsideLoop 4.23 =============================vm: java
trial: 0

用shift和and替换模数

0% Scenario{vm=java, trial=0, benchmark=InsideLoop} 1.27 ns; σ=0.01 ns @ 3 trials
50% Scenario{vm=java, trial=0, benchmark=OutsideLoop} 1.27 ns; σ=0.00 ns @ 3 trialsbenchmark   ns linear runtime
InsideLoop 1.27 =============================
OutsideLoop 1.27 ==============================vm: java
trial: 0

这与第一个结果是一致的,并且一次测试仅慢了0.4-0.6 ns。 (大约两个时钟周期),并且移位几乎没有差异,并且加上测试。 这可能是由于游标卡尺对数据进行采样而不会改变结果的缘故。

毫无疑问,在运行真实程序时,由于微型程序会执行更多操作,因此获得的时间通常比微型基准测试时间更长,因此缓存和分支预测并不理想。 对所花费时间的一小部分过高估计可能更接近您在实际程序中所期望的时间。

结论

这向我表明,在这种情况下,没有任何区别。 我仍然怀疑当JIT编译代码时分配局部变量的成本不会一次,并且没有考虑每个迭代的成本。

参考: 可以优化同步吗? 来自我们的JCG合作伙伴 Peter Lawrey,来自Vanilla Java博客。

翻译自: https://www.javacodegeeks.com/2012/12/local-variables-inside-a-loop-and-performance.html

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

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

相关文章

CSS3伪元素、伪类选择器

伪元素选择器&#xff1a; ::first-letter:为某个元素中的文字的首字母或第一个字使用样式。 ::first-line:为某个元素的第一行文字使用样式。 ::before:在某个元素之前插入一些内容。 ::after:在某个元素之后插入一些内容 ::selection:匹配元素中被用户选中或处于高亮状态的部…

bzoj1212: [HNOI2004]L语言

这又是什么神题啊。 这题一眼AC机。然后呢企鹅也是这么想的。 写完发现企鹅看错题了。然后其实建字典树就行了。 弄个v数组表示能否匹配到第i个位置。然后因为字典里的串很短&#xff0c;就判一下前面L&#xff08;表示字典里最长那个串的长度&#xff09;个位置能否匹配&#…

css小随笔(二)与通用样式

51先在学校HTML5已经有半个多月了&#xff0c;然后这个星期做了一个京东的手机网站&#xff0c;接触到了通用样式&#xff0c;下面以京东的手机站为例 这两个就是京东手机站了的不同的两个板块&#xff0c;因为HTML5仅仅只是学完了基本标签跟css的标签&#xff0c;所以在没有接…

增加堆大小–谨防眼镜蛇效应

“眼镜蛇效应”一词源于英国殖民印度统治英国时所产生的轶事。 英国政府担心毒蛇眼镜蛇的数量。 因此&#xff0c;政府对每条死蛇给予悬赏。 最初&#xff0c;这是一个成功的策略&#xff0c;因为大量蛇被杀死以获取奖励。 最终&#xff0c;印度人开始养殖眼镜蛇以赚取收入。 …

label 标签里面元素点击事件

想做一个单击显示&#xff0c;单击消失的效果&#xff0c;两个元素都在label标签里面&#xff0c;通过打log发现&#xff0c;当点击消失的时候&#xff0c;先执行了消失的单击事件&#xff0c;有执行了出现的单击事件&#xff0c;所以元素并没有消失&#xff0c;这个出现的原因…

java contenttype_POST不同提交方式对应的Content-Type,及java服务器接收参数方式

简介:Content-Type(MediaType)&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff1b;也叫做MIME类型&#xff0c;在Http协议消息头中&#xff0c;使用Content-Type来表示具体请求中的媒体类型信息.参考response.Header里常见Content-Type一般有以下四种&…

Java 进程占用 VIRT 虚拟内存超高的问题研究

一、现象说明 最近发现线上机器java 7(openjdk)进程的 VIRT 虚拟内存使用达到了 50G&#xff0c;如下所示&#xff1a; PID    USER  PR NI VIRT  RES SHR S   %CPU   %MEM   TIME   COMMAND 3130   tomcat  20 0 9128m  1.4g 6544 S…

如何创建可扩展的Java应用程序

开放的扩展使许多应用程序受益。 这篇文章描述了两种在Java中实现这种可扩展性的方法。 可扩展的应用 可扩展应用程序是可以扩展其功能而不必重新编译它们 &#xff0c;有时甚至不必重新启动它们的应用程序。 只需将jar添加到类路径中&#xff0c;或通过更复杂的安装过程来实现…

聊聊一直困扰前端程序员的浏览器兼容-【css】

1.为什么会出现浏览器兼容问题&#xff1f; 由于各大主流浏览器由不同的厂家开发&#xff0c;所用的核心架构和代码也很难重和&#xff0c;这就为各种莫名其妙的Bug(代码错误&#xff09;提供了温床。再加上各大厂商出于自身利益考虑而设置的种种技术壁垒&#xff0c;让CSS应用…

权限提升

UACMe – Defeat Windows User Account Control (UAC) https://github.com/hfiref0x/UACME MiniHook Lib project https://github.com/TsudaKageyu/minhook CrackMapExec – Active Directory Post-Exploitation Tool https://www.darknet.org.uk/2017/07/crackmapexec-active-…

java getrealpath_JavaEE路径陷阱之getRealPath

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径&#xff01;应该使用ServletContext的getResource()方法&#xff0c;直接使用相对于Web应用根目录的相对路径来获取资源。ServletContext接口中定位资源的方法getResourcejava.net.URL getResource(java.lang.St…

与客户患难与共

在採訪Werner Vogels&#xff08;亚马逊的首席技术官&#xff09;的过程中&#xff0c;他描写叙述了亚马逊的开发者是怎样跟他们的用户保持沟通的&#xff1a;记住。我们的大部分开发者都跟客户保持着良好的接触&#xff0c;因此他们对“客户喜欢什么”、“客户不喜欢什么”、“…

Camel 2.11 –没有Spring的Camel Web应用程序

在撰写本文时&#xff0c;我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件&#xff0c;该组件允许使用Camel运行Web应用程序&#xff0c;而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说&#xff0c;在2013年&#xff0c;我们…

关于盒模型的一点总结

标准w3c盒模型图示 关于怪异盒模型和标准盒模型的对比 关于怪异盒模型盒标准盒模型之间的转换

Day 9 函数的初识1

def my_len(): l1 [1,2,3,5,6] print(111) print(222) return print(333)print(my_len())一、函数的定义1.遇到return &#xff0c;此函数结束&#xff0c;if 不在向下进行:2.return 的返回值 1. 不写return 返回为none 2. return non &#xff0c;和1 …

java 反射机制性能_Java反射机制的用途和缺点

Java反射机制的用途和缺点反射的用途 Uses of ReflectionReflection is commonly used by programs which require the ability toexamine or modify theruntime behavior of applications running in the Java virtual machine. Thisis a relatively advancedfeature and shou…

最近的生活

这个暑假主要时间都在公司实习&#xff0c;没有去自己学习很新的一些技术&#xff0c;因为现在这个公司的技术栈不是特别的新&#xff0c;不过实习了一段时间发现&#xff0c;其实技术栈新不新和你一个新手根本就没有半毛钱关系&#xff0c;根基不牢学什么白搭是吧 举个例子&am…

将大型项目从Ant迁移到Maven

事实是&#xff0c;我们处在艰难时期。 我们花了将近三个月的时间将构建机制从Ant迁移到Maven 。 如果您打算在大型项目中做同样的事情&#xff0c;那就是您必须安排的最短时间。 我们仍在努力解决这种迁移带来的一些附带影响&#xff0c;但幸运的是&#xff0c;它们并不是那么…

移动端布局方案探究

研究了淘宝&#xff0c;天猫和网易彩票163的wap主页样式布局&#xff0c;总结移动端布局方案 注意&#xff1a;代码运行是file协议&#xff0c;在chrome里不支持引用本地文件&#xff0c;会提示跨域错误&#xff0c;可以用firefox或者Safari打开 当时做的ppt下载: 2015年12月移…

搭建springboot环境

1.前戏准备: SpringBoot核心jar包:这里直接从Spring官网下载了1.5.9版本. jdk:jdk1.8.0_45. maven项目管理工具:3.5版本. tomcat:8.5版本. 本地仓库:注意settings.xml里面的设置"<localRepository>E:/SpringBoot/repository</localRepository>"红色部分代…