Is there any performance difference between using > and >= in a loop
在循环中,我们保持终止条件,并在每次传递中检查这些条件。
我看过两种检查方法
1。 i > x 或 i < x 。
第二种方法是
2。 i >= x 或 i <= x 。
在进行逻辑比较时,这两种方法的性能是否存在差异?
两个操作所需的执行时间是否有任何差异?即>和> =?
- 对。第二个迭代进行一次以上的迭代。
- 它与性能无关,只与逻辑有关。
- @Marounmaroun取决于你从哪里开始……
- 我在大学里听说,与零比起来更有效。所以i>=0应该比i>-1更有效,不过我没有任何解释。
- @Sidgate通常由编译器决定哪一个最适合用于目标体系结构,在代码中,我们尝试使用最佳逻辑来表示正在解决的问题。
- @Yassinhajaj是真的。因为OP正在比较它们,所以我认为它们是相同的。
- @在C语言中,生成的与零比较的程序集代码是一个简单的符号检查指令(无论如何在x86处理器上),其中与其他值进行比较必须实际进行比较。在爪哇,JIT可能会做同样的事情,但它不太有意义,因为你无法控制JIT。
- 如果x是一个变量,那么i < x和i <= x-1之间可能存在性能差异(除非有包装,否则在逻辑上是等效的)。减法需要一点时间。但是,如果这是一个循环终止条件,并且x是一个局部变量,那么一个好的编译器可能会知道x在循环期间不能更改,并且只做一次减法。
- 根据我的经验,i < x比i <= x更常用,因为通常在数组中循环元素。如果您执行for (int i = 1; i <= x; i++),其中x是数组的长度,那么您将使i-1分散在代码体中。如果你做了for (int i = 0; i <= x -1; i++),你会有相同的循环体,但在这种情况下,for (int i = 0; i < x; i++)看起来更干净。如果与i <= x相反,i < x有任何性能提升,我的假设是任何现代编译器都会将i <= x和您的代码优化为类似于i < x的东西。
这两个语句之间几乎没有性能差异,但这两个语句及其逻辑流之间存在显著差异。
例如:
- 如果有一个循环一直运行到i <= 20,那么您将循环到i == 20。
- 如果有一个循环一直运行到i < 20,那么将循环到i == 19。
如果有一个条件要求迭代值停在某个值之前,请确保选择最适合它的不等式。
不过,总的来说,如果这个布尔语句在运行时或性能上有任何差异,那么它几乎不会被注意到。我们不应该把优化工作建立在关闭这些语句的基础上。
*:另外,不要破坏优化规则1。
- 两个操作所需的执行时间是否有差异?即> > >
- 对于原始布尔表达式本身?如果有,这是非常不重要的,如果您希望基于这种决策优化您的平台,那么您应该关注其他领域。
- @vipinagrahari:<与<=的执行时间相同。重复循环一次的执行时间当然直接受迭代所花费时间的影响。
- 当你回答一个问题,又被问到同样的问题时,就好像你连答案都没有一样,难道这不是令人沮丧吗?
- @帕迪,对不起。但我真的不明白是否有什么实际的区别。如果你能提供一些参考,那就太好了。
- @维皮纳格拉哈里:我希望澄清,但我不确定我能澄清。这种差异是微不足道的,如果它存在的话。
不,绝对没有区别。当编译器将其转换为汇编时,它将它们都转换为同一个cmp指令。
- 你是说字节码,不是汇编。
- 不,我没有。我是说集会。这是C。
- 我想我们都是对的。
有时你更喜欢使用<=而不是<,例如在for循环中,我们通常从0转到length-1(如数组长度),我们使用<。但是如果你想把比较值也包括进来,这里是y,并且保持<逻辑,你会得到
1 2 3
| for (x=0 ; x<y+1 ; x++) {
...
} |
做这个的时候
1 2 3
| for (x=0 ; x<=y ; x++) {
...
} |
保存+1计算。
除此之外,大多数处理器都有小于或等于的指令,因此使用其中一个或另一个指令对性能没有影响。