以下哪项更快?
for (int i = 0; i < n; ++i)
或
for (int i = 0; i != n; ++i)
我想知道,因为我不了解硬件,因此无法理解计算机对<
与!=
的看法。
答案 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)
比较<
和!=
都只接受一条指令,但是需要先将两个操作数的值加载到寄存器中。
对于原始数据类型,例如int
,bool
等,每次比较将采用3个CPU指令。对于其他数据类型,它至少需要3条指令,但可能更多。
它还可以依赖于编译器和使用的编译时优化。
答案 3 :(得分:0)
如果将循环体中i
的值更改为大于n
的值(如果满足特定条件,则可能需要增加i
两次,这可能发生在最后一次迭代中),或将n
更改为小于i
的内容,然后第二个版本(使用!=
)循环将不会终止。
如果您想迭代n
次,那么第一个版本(<
)会更安全一些。
更容易证明第一个版本将终止。
(虽然不太可能,如果你真的希望循环在跳过n == i
时继续迭代,那么显然使用第二个版本)