在许多编程语言及其微优化中,我已经看到在for循环中声明数组的长度会对性能产生影响,尤其是在PHP和JavaScript中:
for i = 0, length = arr.length; i < length; ++i
我已经看到了C ++中使用的这种格式以及一些Java源代码。这种微优化是否适用于所有编程语言?如果这是一个与语言无关的微优化,那么它是不是已经从编译器中进行了优化?
答案 0 :(得分:0)
好吧,我认为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);
}
连续几次运行后,结果如下:
6207
Size saved
4594
因此存在1500毫秒的差异。
<强>更新强> 当循环反转时,结果也相反:) 所以缺乏优化没有问题。
因此在Java中调用Container.size不会影响性能。
答案 1 :(得分:0)
编译器的问题是知道arr.length
将在循环中的每次迭代返回相同的内容。例如,有时它不会在循环体将新元素插入arr
时。