【发布时间】:2014-04-03 20:15:49
【问题描述】:
让我们交换 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]
哪些会更快? (欢迎客人)
【问题讨论】:
-
这也取决于运行的 CPU。
-
这个问题没有实际意义,考虑到所讨论的指令都不能直接对两个内存操作数进行操作。
-
真的等一下吗?好吧,无论如何排除
xchg,我将把我的伪代码重新制作为mov,以便首先注册 -
我没有测量,但我猜内存访问比寄存器操作慢得多,所以第一个应该更快。另一个想法:如果你的交换在一个循环中,展开循环一次可能完全摆脱对变量交换的需要。
-
您的“半优化 asm 伪代码”甚至不起作用。它从不将值存储到内存中。我认为你最后两条指令中操作数的顺序是颠倒的(即应该是
mov dword ptr[rbp+8],eax)。此外,您不可能比 4 次更快地执行 6 次内存访问。我强烈怀疑第一个示例,一旦您修复它,将比第二个更快。
标签: performance optimization assembly x86 mov