我被分配到一个Android-Java(实时游戏)项目,该项目具有相当大的(部分遗留的)代码库。
我看到的大多数循环都是这样的(其中mjk通常是Java数组):
int count = mjk.length;
for (int i = 0; i != count; ++i) {
// Stuff dealing with mjk[i]
}
我通常写这样的循环:
int count = mjk.length;
for (int i = 0; i < count; i++) {
// Stuff dealing with mjk[i]
}
知道为什么原作者(我到目前为止无法联系)使用以前的表格?它在C ++中很常见吗?
我问这个实际的原因是JIT优化:据我所知,Android优化循环(归纳变量,不变量,范围检查迁移到循环序言等),我想知道不相等可能会阻止这样的优化(不像更低) -than,指定明确定义的范围)。
我只是好奇第一次使用是否比第二次使用有任何优点/缺点(在所有方面)。
第二种形式有一个明显的优势:如果你有一些错误操纵 i
在循环内部,如果第一个表单可能会崩溃 i
get被赋值给大于的值 mjk.length
第二种形式将简单地结束循环。
我在第二种方法中可以看到的唯一一个优点是“!=”可能比“<”运行得更快,但我甚至不确定这种情况会发生(这可能取决于JVM实现和硬件本身。)但是请注意,如果你在循环中做了一些事情,那么差异就不会被注意到,因为它每次迭代只执行一次。
我肯定会使用第二个,因为它更安全。
我相信这只是一个没有经验的程序员。一般来说,使用a当然总是更好 <
为了更健壮。在使用索引进行欺骗的情况下(例如,通过将步长间隔更改为 i+=2
),它不会产生无限循环。
从技术上讲,比较可能会占用较少的CPU时间(虽然不太熟悉),但效果很小或者说无关紧要,它不会破坏任何程序的性能...... :)
我认为编写代码的人可能会喜欢容器(地图,矢量)(!!)
因为!=主要用于迭代容器的元素。例如,迭代任何泛型类型的元素!=将适用于地图和向量,而<将仅适用于向量。因此,对于迭代通用时间元素!=使用。而不是我没有找到任何其他优势。 (对专家的消化/纠正有希望)
我记得很久以前在编写c ++时遇到过这种情况。
有利于它的论点是i在退出循环时的值更清楚 - 即一目了然,在循环退出时我会==计数。
如果循环变量 一世 以某种方式在循环内获得不正确的超出范围的值,第一个版本将崩溃,第二个版本将结束循环。
这可能是一个优势 第一 版本,崩溃的那个。当你的银行运行程序来处理你的钱,并且有一个错误时,你是否希望程序崩溃时出现明显的错误,因此他们知道他们必须修复它,或者它应该只是默默地继续并计算错误的结果?
当然有系统(生命支持,飞机控制等),任何结果都比停止的程序更好。但是,作为一般规则,假设这是不明智的。