在这种情况下被认为是最佳做法?
for (i=0; i<array.length(); ++i)
或
for (i=array.length()-1; i>=0; --i)
假设我不想从某个方向迭代,而是在数组的裸长度上迭代。另外,我不打算在循环体中改变数组的大小。
那么,array.length()
在编译期间是否会变为常量?如果没有,那么第二种方法应该是那个......
答案 0 :(得分:1)
版本2已损坏,将从阵列的一个结尾迭代到1. (现已更正)
坚持使用版本1.它得到了很好的认可,并没有让读者做双重拍摄。
答案 1 :(得分:1)
我会做第一种方法,因为它更具可读性,我可以看一下,看看你正在迭代循环。第二个花了我一秒钟:(。
只要你没有修改数组, array.length
将保持不变。
答案 2 :(得分:1)
版本1的使用范围更广泛,更易于理解。如果编译器没有将array.length()优化为常量,但是...... insert your own premature optimization comment here
编辑:关于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