加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 用于原始数组的现代for循环

发布时间:2020-12-15 00:07:57 所属栏目:Java 来源:网络整理
导读:在原始数组上的for循环之间是否存在性能差异? 承担: double[] doubleArray = new double[300000];for (double var: doubleArray) someComplexCalculation(var); 要么 : for ( int i = 0,y = doubleArray.length; i y; i++) someComplexCalculation(double
在原始数组上的for循环之间是否存在性能差异?

承担:

double[] doubleArray = new double[300000];


for (double var: doubleArray) 
   someComplexCalculation(var);

要么 :

for ( int i = 0,y = doubleArray.length; i < y; i++)
   someComplexCalculation(doubleArray[i]);

测试结果

我实际上是分析:

Total timeused for modern loop= 13269ms
Total timeused for old loop   = 15370ms

所以现代循环的运行速度更快,至少在我的Mac OSX JVM 1.5上.

解决方法

您的手写“旧”表单执行较少的指令,可能会更快,尽管您必须在给定的JIT编译器下配置文件以确定. “新”形式肯定不会更快.

如果您看到反汇编的代码(由Sun的JDK 1.5编译),您将看到“新”表单等效于以下代码:

1: double[] tmp = doubleArray;
2: for (int i = 0,y = tmp.length; i < y; i++) {
3:   double var = tmp[i];
4:   someComplexCalculation(var);
5: }

所以,你可以看到使用更多的局部变量.在第1行的doubleArray到tmp的赋值是“extra”,但它不会发生在循环中,并且可能无法测量.第3行对var的赋值也是额外的.如果性能有差异,这将是负责任的.

第1行似乎是不必要的,但是如果在进入循环之前通过方法计算数组,则将其结果缓存.

也就是说,我将使用新的表单,除非您需要使用索引变量进行某些操作.在运行时,JIT编译器可能会优化任何性能差异,而新窗体更为清晰.如果您继续“手动”,您可能会错过未来的优化.一般来说,一个好的编译器可以优化“愚蠢”代码,但是在“智能”代码上绊倒.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读