Language agnostic 对于循环长度局部变量微优化?
在许多编程语言及其微优化中,我已经看到在for循环中声明数组的长度会影响性能,特别是在PHP和JavaScript中:Language agnostic 对于循环长度局部变量微优化?,language-agnostic,for-loop,micro-optimization,Language Agnostic,For Loop,Micro Optimization,在许多编程语言及其微优化中,我已经看到在for循环中声明数组的长度会影响性能,特别是在PHP和JavaScript中: for i = 0, length = arr.length; i < length; ++i 对于i=0,长度=arr.length;i
for i = 0, length = arr.length; i < length; ++i
对于i=0,长度=arr.length;i<长度++我
<>我看到了C++中使用的格式以及一些java源代码。这种微优化对所有编程语言都适用吗?如果这是一种与语言无关的微优化,那么它是否应该从编译器内部进行优化呢?我认为Java编译器会关注这种优化,但事实并非如此:
public static void main(String[] args) {
String[] array = new String[10000000];
Arrays.fill(array, "Test");
long startNoSize = Calendar.getInstance().getTimeInMillis();
for(int i=0; i< array.length;i++)
{
array[i]=String.valueOf(i+1);
}
long finishNoSize = Calendar.getInstance().getTimeInMillis();
System.out.println(finishNoSize-startNoSize);
System.out.println("Size saved");
int length = array.length;
long startSize = Calendar.getInstance().getTimeInMillis();
for(int i=0; i< length;i++)
{
array[i]=String.valueOf(i+2);
}
long finishSize = Calendar.getInstance().getTimeInMillis();
System.out.println(finishSize-startSize);
}
所以有1500毫秒的差异
更新
当循环反转时,结果也会反转:)
因此,不存在缺乏优化的问题
因此,在Java中调用Container.size不会影响性能。编译器的问题是知道
arr.length
将在循环中的每次迭代中返回相同的值。有时它不会,例如,当循环体将新元素插入arr
时,与我的计算机的结果相同,但仍然是错误的。切换两个测试用例,情况正好相反。所以实际上是一个“冷”jre的问题。我理解不使用这种格式的意义,但它是非变异例程中最常见的for循环实现之一。这种格式很乏味,而且跨越了文本编辑器。我希望至少有一个编译器可以对此进行优化(因为每个循环都是任意的,因为它们不能保证顺序)。
6207
Size saved
4594