关于for循环条件的最佳实践

时间:2010-05-25 23:14:31

标签: for-loop compilation compile-time

在这种情况下被认为是最佳做法?

for (i=0; i<array.length(); ++i)

for (i=array.length()-1; i>=0; --i)

假设我不想从某个方向迭代,而是在数组的裸长度上迭代。另外,我不打算在循环体中改变数组的大小。

那么,array.length()在编译期间是否会变为常量?如果没有,那么第二种方法应该是那个......

7 个答案:

答案 0 :(得分:1)

版本2已损坏,将从阵列的一个结尾迭代到1. (现已更正)

坚持使用版本1.它得到了很好的认可,并没有让读者做双重拍摄。

答案 1 :(得分:1)

我会做第一种方法,因为它更具可读性,我可以看一下,看看你正在迭代循环。第二个花了我一秒钟:(。

只要你没有修改数组,

array.length将保持不变。

答案 2 :(得分:1)

版本1的使用范围更广泛,更易于理解。如果编译器没有将array.length()优化为常量,但是...... insert your own premature optimization comment here

,版本2可能偶尔会稍快一点

编辑:关于array.length()是否会被优化,它将取决于语言。如果语言使用数组作为“普通”对象或数组可以动态调整大小,那么它只是一个方法调用,编译器不能假设将返回一致的返回值。但是对于阵列是特殊情况或对象的语言(或者编译器真的很聪明......),速度差异可能会被消除。

答案 3 :(得分:1)

在大多数情况下,我希望array.length()以O(1)的方式实现,因此它不会真正影响循环的性能。如果您有疑问,或者想确保它是常数,请明确这样做:

// JavaScript
var l = a.length;

for (var i=0; i<l; i++) {
  // do something
}

我认为反向符号是属于过早优化类别的“聪明黑客”。它更难阅读,更容易出错,而且与我建议的替代方案相比并没有真正提供好处。

但是由于编译器/解释器的实现差异很大,并且您没有说出您所使用的语言,因此很难对此进行绝对的陈述。我要说的是,除非这是一个绝对时间关键的代码部分,否则会对代码运行时间做出明显的贡献,并且您的基准测试表明以不同的方式提供实际的好处,我会坚持使用更容易理解和维护的代码

答案 4 :(得分:0)

for (i=0; i<array.length(); ++i)对我来说更好,但是for (i=array.length()-1; i>=0; --i)是最快的,因为普通处理器最快检查条件,比较0,条件比较两个varbiales。

如果你不在迭代中添加/删除此数组中的元素,

array.lenght()是常量。

答案 5 :(得分:0)

对于我自己的代码中的for循环,虽然它可能有点过分,但我在编写循环时就养成了这样的习惯,即长度只计算一次,但循环以自然的方式进行:

int len = array.length();
for (int i=0; i<len; ++i) {
    doSomething(array[i]);
}

但是,现在,我更喜欢使用“for-each”设施,这些设施既方便又便利;它们使循环更容易阅读和万无一失。在C ++中可能是这样的:

std::for_each(array.begin(), array.end(), &doSomething);

答案 6 :(得分:0)

版本1最快。 for(i = 0; i