本问题已经有最佳答案,请猛点这里访问。
在循环中,我们保持终止条件,并在每次传递中检查这些条件。
我看过两种检查方法
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 (x=0 ; x
...
}
做这个的时候
for (x=0 ; x<=y ; x++) {
...
}
保存+1计算。
除此之外,大多数处理器都有小于或等于的指令,因此使用其中一个或另一个指令对性能没有影响。