局部变量写在循环内还是外_循环内的局部变量和性能

局部变量写在循环内还是外

总览

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

最近, 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/349535.shtml

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

相关文章

csp-s模拟测试44「D·E·F」

用心出题,用脚造数据 乱搞场 1 #include<bits/stdc.h>2 #define re register3 #define int long long4 #define inf 0x7ffffffffffffff5 using namespace std;6 int n,a[100010],b[100010],ansinf;7 double st,ed;8 inline int read(){9 re int a0,b1; re char chget…

c++中的new_怎么在java中创建一个自定义的collector

简介在之前的java collectors文章里面&#xff0c;我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法&#xff0c;将结果转换为特定的集合类。今天我们介绍一下怎么自定义一个Collector。Collector介绍我们先看一下Collector的定义&#xff1a;Co…

Java 9中的新Regex功能

最近&#xff0c;我收到了Packt出版的Anubhava Srivastava提供的免费书籍“ Java 9 Regular Expressions” 。 这本书是一个很好的教程&#xff0c;它向任何想学习正则表达式并从头开始的人介绍。 那些知道如何使用正则表达式的人可能仍然很有趣&#xff0c;以重申其知识并加深…

c语言实现二分法_C语言实现二分法求解方程在区间内的根

C语言实现二分法求解方程在区间内的根。设有非线性方程&#xff1a;其中&#xff0c; 为 上连续函数且设 (不妨设方程在 内仅有一个实根)&#xff0c;求上述方程实根的二分法过程&#xff0c;就是将含根区间[a,b]逐步分半&#xff0c;检查函数值符号的变化&#xff0c;以便确定…

计划

赤 wqs二分 https://www.cnblogs.com/Juve/p/11479423.html https://www.cnblogs.com/Rorschach-XR/p/11479602.html 反悔贪心 https://www.cnblogs.com/cjyyb/p/9367948.html https://www.cnblogs.com/Miracevin/p/9795871.html https://blog.csdn.net/weixin_34344677/articl…

java写入文件编码格式为ansi_Windows10 bat批处理删除 快速打开文件夹 固定到开始菜单或任务栏...

1. 快速打开文件夹1.1 bat文件如果你经常打开一个被放在很深的文件夹&#xff0c;于是浪费很多打开文件的时间&#xff1a;开始>此电脑>Data(D:)>文件夹1>文件夹2...>文件夹n>平均要浪费大约10秒的时间&#xff0c;如果每天打开100次&#xff0c;那么1000秒&…

python中__init__.py的作用、module和package

控制包的导入行为&#xff1a; 1、声明当前文件是一个可导入的包&#xff1b;2、如果当下包下有多个.py文件使用__ all__ [ 模块名]&#xff0c;也就是form XXX import YYYmodule和package 为了编写可维护的代码&#xff0c;我们把很多函数分组&#xff0c;分别放到不同的文件…

java default修饰符_Java基础语法二

Java循环结构for循环/* for(初始化;布尔表达式;更新) {执行代码 } */ for(int i0; i < 5; i) {System.out.println(i); }最先执行初始化步骤&#xff1b;可以声明一种类型&#xff0c;但可初始化一个或多个循环控制变量&#xff0c;也可以是空语句然后检测布尔表达式&#x…

微信开发修改button里的字体大小_微信小程序全栈开发课程【视频版】2.2 index页面完善...

​点击观看视频课程 ↓↓↓微信小程序首页完善https://www.zhihu.com/video/1195308096099282944课程文字版1、template 部分&#xff08;1&#xff09;修改template部分的代码template里面包含html代码&#xff0c;对应着原生小程序框架里中的.wxml文件。我们将index.vue文件中…

jaxb list集合对象_JAXB –表示空集合和空集合

jaxb list集合对象示范代码 以下演示代码将用于Java模型的所有不同版本。 它只是将一个集合设置为null&#xff0c;第二个设置为空列表&#xff0c;第三个设置为填充列表。 package package blog.xmlelementwrapper;import java.util.ArrayList; import javax.xml.bind.*;publ…

.net 把一个对象赋值给一个参数_Java GC回收算法-判定一个对象是否可以回收

开源推荐推荐一款一站式性能监控工具&#xff08;开源项目&#xff09;Pepper-Metrics是跟一位同事一起开发的开源组件&#xff0c;主要功能是通过比较轻量的方式与常用开源组件&#xff08;jedis/mybatis/motan/dubbo/servlet&#xff09;集成&#xff0c;收集并计算metrics&a…

管理角色认知-新晋管理常常犯的错

背景 管理是一门实践科学&#xff0c;从知道到做到&#xff0c;需要长时间的刻意练习&#xff0c;提前知道那些坑&#xff0c;可以提前规避。 坑1&#xff1a;被动执行 现象&#xff1a; 不主动找活干&#xff0c;等上级派活&#xff1b; 上级有了安排&#xff0c;指望上级替他…

头条号个人中心登录_登陆自己的头条号后台操作步骤

作为一个自媒体新人对自媒体的知识还是不够了解的&#xff0c;有的新人甚至还不知道什么是头条号后台&#xff0c;这篇文章是专为新手写的一篇文章&#xff0c;带你走进你的头条号后台遛一圈。那么什么是头条号后台呢&#xff1f;这里笔者就作下简单的介绍方便新人学习。登陆自…

python保存变量_将python 中的变量保存到本地

如何将python中的变量保存在本地&#xff1f; 将python 的一些代码保存在本地&#xff0c; 特别是一些需要大量运算的结果&#xff0c;例如 机器学习里面的模型&#xff0c;&#xff0c;放在本地&#xff0c;还是比较好用的。下次就可以直接拿出来使用就好。 其实可以 我觉得可…

django filter查询多选_Django:使用filter的pk进行多值查询操作

由于想要做收藏夹的功能&#xff0c;所以希望能够一次性查询出所有id的对象&#xff0c;查看文档&#xff0c;找到了如下方法pk是primary key的缩写&#xff0c;顾名思义pk_in就是primary key在某一个范围内&#xff0c;具体操作(以自带的User为例)&#xff1a;User.objects.fi…

csp-c模拟测试「set·read·」

set 题解 只要求一组特解 像入阵曲一样就好了(入阵曲真是好题啊$!$) $(sum[r]-sum[l])\%n0$ 拆成$sum[r]\%nsum[l]\%n$桶里存$sum[l]\%n$每次找$sum[r]$桶里有没有对应的#sum[l]# 存$tong[0]1$,别的先查后存 证明 证明一下正确性 $0$自己合法$(sum[r]\%n)0$不需要找对应 其他都…

JSP,JSF和EL简介

JavaServer页面&#xff0c;JavaServer Faces和表达语言 在本文中&#xff0c;我将研究JavaServer Pages&#xff08;JSP&#xff09;和Expression Language&#xff08;EL&#xff09;&#xff0c;然后将其与JavaServer Faces &#xff08;JSF&#xff09;关联。 我将讨论如何…

stream模式不能接受blob文件_一文带你层层解锁文件下载的奥秘

今天带来的主题是关于文件下载&#xff0c;通过本文带你领略文件下载的奥秘。本文会花费你较长的时间阅读&#xff0c;建议先收藏/点赞&#xff0c;然后查看你感兴趣的部分&#xff0c;平时也可以充当当做字典的效果来查询。:) 不整不知道&#xff0c;一整&#xff0c;居然整出…

# 管道已结束_县城这条路启用自来水新管道,看看是否在你家附近...

连日来&#xff0c;县自来水公司的工作人员顶着高温抓紧作业&#xff0c;目前&#xff0c;县城范堤路自来水管道改造工程已过半&#xff0c;预计本月中旬完工。施工现场1目前&#xff0c;盐垣路至掘中路的新管道正在进行对接&#xff0c;为了确保启用新管道后的用水安全&#x…

python 中的eval与exec

eval类似exec,是使用python编译器运行表达式和语句两者区别在于:eval是编译表达式并返回值(如: eval("hello*2") 结果是 hellohello)exec则是运行一部分代码,并且不像eval那样返回结果,exec的返回值永远是None,且exec可运行多行代码(如: exec("l[1,2,3]\nfor i …