我在读this article,我注意到了jz
指令。这让我思考:“Jump if zero”(jz)更快吗?
请问这代码组件,以票面价值
for (int i=max;i!=0;--i){
//Some operation
}
采取超越这个代码?
for (int i=0;i<max;++i){
//Some operation
}
只要你不关心你的数据与增加i
处理,不存在语义差别。缓存未命中也不会受到影响,因为它们可以按顺序工作。
我在汇编时不够好写例子,但我会认为第一个例子只会使用jz
。第二个将使用cmp
,然后使用jg
,并且还需要另一个变量max
。第一个例子只需要循环计数器,因为0
是隐含的。
这也可能是编译器用来优化的东西,但我可以想象它无法进行优化的情况。
是的,我认为这取决于每个不同跳转指令所需的周期数。我不知道离手,但是如果你查看你的目标指令集,你应该能够找到每条指令使用的循环次数的枚举。 – JustKevin 2014-09-05 04:48:47
它可能仍然需要cmp指令,因为它是存储位置的比较。循环计数器也可以在稍后的编译器中自动分配给寄存器。 – JustKevin 2014-09-05 04:52:02
另请参阅:http://stackoverflow.com/a/22466475 – harold 2014-09-06 09:50:21