在这种情况下,什么被认为是最佳做法?
for (i=0; i<array.length(); ++i)
或者
for (i=array.length()-1; i>=0; --i)
假设我不想从某个方向迭代,而是在数组的裸长度上迭代。另外,我不打算改变循环体中数组的大小。
那么,array.length()
编译过程中会变得不变吗?如果没有,那么第二种方法应该是要采用的方法..
在这种情况下,什么被认为是最佳做法?
for (i=0; i<array.length(); ++i)
或者
for (i=array.length()-1; i>=0; --i)
假设我不想从某个方向迭代,而是在数组的裸长度上迭代。另外,我不打算改变循环体中数组的大小。
那么,array.length()
编译过程中会变得不变吗?如果没有,那么第二种方法应该是要采用的方法..
版本 2 已损坏,将从数组的过去一端迭代到 1。(现已更正)
坚持使用版本 1。它得到了很好的认可,并且不会让读者做出双重选择。
我会使用第一种方法,因为它更具可读性,我可以查看并看到您正在遍历循环。第二个花了我一秒钟:(。
array.length
只要您不修改数组,它将保持不变。
版本 1 使用更广泛,也更易于理解。如果编译器不将 array.length() 优化为常量,则版本 2 有时可能会稍微快一些,但是...insert your own premature optimization comment here
编辑:关于 array.length() 是否会被优化,这取决于语言。如果语言使用数组作为“普通”对象或数组可以动态调整大小,那么它只是一个方法调用,编译器不能假设会返回一致的返回值。但是对于数组是特殊情况或对象的语言(或者编译器真的很聪明......),速度差异可能会被消除。
在大多数情况下,我希望array.length()
以 O(1) 的方式实现,因此它不会真正影响循环的性能。如果您有疑问,或者想确保它是一个常数,只需明确地这样做:
// JavaScript
var l = a.length;
for (var i=0; i<l; i++) {
// do something
}
我认为反向符号是属于过早优化类别的“聪明的黑客”。它更难阅读,更容易出错,并且与我建议的替代方案相比并没有真正提供好处。
但是由于编译器/解释器的实现有很大的不同,而且你没有说你指的是什么语言,所以很难对此做出绝对的陈述。我会说除非这是在代码的绝对时间关键部分或以其他方式对代码运行时间有可衡量的贡献,并且您的基准测试表明以不同的方式进行操作会带来真正的好处,否则我会坚持使用更易于理解和维护的代码.
对于我自己的代码中的 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);
for (i=0; i<array.length(); ++i)
对我来说更好,但for (i=array.length()-1; i>=0; --i)
速度最快,因为与 0 相比,普通处理器检查条件最快,而与两个 varbiales 相比。
array.lenght()
如果您不在迭代下从该数组中添加/删除元素,则它是恒定的。
版本 1 最快。对于 (i=0; 我