哪个更快:!=或<

时间:2014-05-04 23:48:36

标签: optimization

以下哪项更快?

for (int i = 0; i < n; ++i)

for (int i = 0; i != n; ++i)

我想知道,因为我不了解硬件,因此无法理解计算机对<!=的看法。

4 个答案:

答案 0 :(得分:1)

对于原始类型,两个操作都花费完全相同的时间,因为无论您要求哪个都实际确定。

简而言之,无论何时进行基本比较,< <= > >= ==!=,运营商的一方从另一个中减去。然后使用减法的结果来设置多个标志,其中最重要的是Z(零),N(负)和O(溢出)。根据名称,您应该能够弄清楚每个标志代表什么。例如:如果减法结果为零,则设置Z标志。因此,无论您是要求<=还是!=,处理器正在执行的是检查由于初始减法而已正确设置的标志。

理论上,<=应该稍微稍微,因为必须检查两个标志(Z和N)而不是一个(=只关心Z)。但这种情况发生在如此低的水平,即使在微秒级别上,结果也很可能是微不足道的。

如果您真的感兴趣,请阅读processor status registers

对于非基本类型,即类,它取决于关系运算符的实现。

答案 1 :(得分:0)

这些编译到完全相同数量的机器指令 - 如果Less是单个汇编指令,则跳转等于和跳转。您可以在此处阅读这些说明:http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow#Jump_on_Equality

答案 2 :(得分:0)

比较<!=都只接受一条指令,但是需要先将两个操作数的值加载到寄存器中。

对于原始数据类型,例如intbool等,每次比较将采用3个CPU指令。对于其他数据类型,它至少需要3条指令,但可能更多。

它还可以依赖于编译器和使用的编译时优化。

答案 3 :(得分:0)

如果将循环体中i的值更改为大于n的值(如果满足特定条件,则可能需要增加i两次,这可能发生在最后一次迭代中),或将n更改为小于i的内容,然后第二个版本(使用!=)循环将不会终止。

如果您想迭代n次,那么第一个版本(<)会更安全一些。

更容易证明第一个版本将终止。

(虽然不太可能,如果你真的希望循环在跳过n == i时继续迭代,那么显然使用第二个版本)