循环检查条件

时间:2013-04-25 18:59:17

标签: java loops

我想向更多有经验的开发人员询问一个简单但对我来说不明显的事情。假设你有这样的代码(Java):

for(int i=0; i<vector.size(); i++){
   //make some stuff here
}

我经常遇到这样的陈述,所以也许没有任何错误。但对我来说,似乎没有必要在每次迭代中调用一个size方法。我会用这种方法:

int vectorSize = vector.size();
for(int i=0; i<vectorSize; i++){
    //make some stuff here
}

同样的事情:

for(int i=0; i<myTreeNode.getChildren().size(); i++){
   //make some stuff here
}

我绝对不是编程方面的专家,所以我的问题是:我是否在寻找保证对冲的空白,或者在专业代码中处理这些细节很重要?

3 个答案:

答案 0 :(得分:8)

方法调用要求JVM确实执行其他操作。所以你正在做的事情,首先看来似乎是一种优化。

但是,一些JVM实现足够智能,可以内联方法调用,对于那些,差异将不存在。

例如,Android编程指南总是建议您执行您已指出的内容,但同样,JVM实施手册(如果您可以开始使用)将告诉您它是否为您优化代码。

答案 1 :(得分:2)

通常size()是一个小的常量时间操作,因此与执行循环体的成本相比,调用size的成本是微不足道的,并且即时编译器可能正在处理这个优化适合你;因此,这种优化可能没有多大好处。

也就是说,这种优化不会对代码可读性产生负面影响,因此不应该避免;通常代码优化只会通过一个小因素影响速度(与例如将O(n)操作更改为O(1)操作的优化相反)应该避免这种情况,例如你可以unroll a loop

int i;
int vectorSizeDivisibleBy4 = vectorSize - vectorSize % 4; // returns lowest multiple of four in vectorSize
for(i = 0; i < vectorSizeDivisibleBy4; i += 4) {
    // loop body executed on [i]
    // second copy of loop body executed on [i+1]
    // third copy of loop body executed on [i+2]
    // fourth copy of loop body executed on [i+3]
}
for(; i < vectorSize; i++) { // in case vectorSize wasn't a factor of four
    // loop body
}

通过将循环展开四次,可以将i < vectorSize的评估次数减少四倍,代价是使代码无法读取(可能还会破坏指令缓存,从而导致在负面的表现影响)。不要这样做。但是,就像我说的那样,int vectorSize = vector.size()并不属于这一类,所以就这样了。

答案 2 :(得分:0)

在第一眼看到替代方案,你建议接缝进行优化,但就速度而言,它与通用方法相同,因为:

java向量中size()函数调用的复杂性时间具有O(1)阶的复杂度,因为每个向量总是存储一个包含其大小的变量,因此您不需要计算其大小。每次迭代,你只需访问它。

请注意: 你可以看到:http://www.docjar.com/html/api/java/util/Vector.java.html中的size()函数只是返回一个受保护的变量elementCount。

相关问题