让我们交换 2 个变量。
int temp = a;
a = b;
b = temp;
这是一些半优化的 asm 伪代码:
mov eax, dword ptr [rbp+4]
mov ebx, dword ptr [rbp+8]
mov dword ptr [rbp+8], eax
mov dword ptr [rbp+4], ebx
将对象相互异或会更快吗?
a ^= b ^= a ^= b;
asm 伪代码:
mov eax, dword ptr[rbp+4]
xor eax, dword ptr[rbp+8]
xor dword ptr[rbp+8], eax
xor eax, dword ptr[rbp+8]
xor dword ptr[rbp+8], eax
mov eax, dword ptr[rbp+4]
哪一个会更快? (欢迎 guest )
最佳答案
将其放入两个寄存器然后写回交换内容可能是最快的解决方案。四个内存周期,四个指令,两个寄存器。假设数据必须从 ram 开始并返回到 ram,那么您通常无法击败这种方法。
假设您可以为源和目标存储四个异或,则每个异或三个周期,即 12 个存储周期,这绝对是失败者。使用寄存器来避免两个内存操作数只会增加更多指令。
您的 asm 伪代码是 6 个内存周期。 6条指令一个寄存器。四个周期、四个指令和两个寄存器可能更便宜。现在,如果您必须执行两个内存周期来释放这些寄存器,它就变成了 6 个周期。最后一个将是一个额外的释放寄存器的地方,所以 7.6 仍然比 7 便宜,5 条指令比 7 便宜,这里没有计算指令大小,但增加了内存周期,尽管提取可能以有效的方式完成(在大小合适的对齐 block 中)。
如果数据已经在寄存器中,那么使用第三个寄存器并执行三个指令 tmp = a, a = b, b = tmp 是三个寄存器的三个操作并且最快。但是,如果您只是不能节省一个寄存器,那么四个异或运算会更快。
这就是一个通用的高级 View ,可能存在处理器和缓存情况等,这些情况可能会使一个解决方案看起来更快,但对于一项测试来说,最终肯定会更快,但一般情况下,这可能取决于具体情况。
关于performance - 通过 mov, xor 交换变量的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22848081/