performance - 通过 mov, xor 交换变量的成本

标签 performance optimization assembly x86 mov

让我们交换 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/

相关文章:

performance - 读取数组然后排序还是边读取数组边排序更快?

php - 高效 MySQL 查询 : running various queries through multiple tables, 将结果表分配给数组

database - 应该使用什么数据库/技术来计算时间范围内的唯一身份访问者

c++ - 将一个整数的位 X 设置为另一个整数的位 Y 而无需分支?

mysql - 优化 MySQL 全文搜索查询?

c++ - 在早期的C和C++编译器中,手动移位与乘法和除法的相关性如何?

windows - 为什么PE需要Original First Thunk(OFT)?

c++ - 运行时检查失败 #0 - ESP 的值未在函数调用中正确保存

mysql:多索引建议

assembly - 为什么 `add cl, 2` 以 x86 十六进制打印 `80 c1 02`?