我正在阅读 this article ,我注意到了 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
是隐式的。这也可能是编译器已经用来优化的东西,但我可以想象它无法进行优化的情况。
最佳答案
假设我们有 cmp a,b
。
处理器将临时减去操作数(不影响它们的值),正确设置标志,然后评估您的 jmp
跳转操作。
因此,在您的示例中制作 jz
会更快,而不是 cmp
和 jmp
。
关于performance - "Jump if zero"(jz) 更快吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25678692/