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