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编译器可能会优化任何性能差异,而新窗体更为清晰.如果您继续“手动”,您可能会错过未来的优化.一般来说,一个好的编译器可以优化“愚蠢”代码,但是在“智能”代码上绊倒. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |