我正在阅读 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 会更快,而不是 cmpjmp

关于performance - "Jump if zero"(jz) 更快吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25678692/

10-12 20:09