通过mov,xor交换变量的代价
让交换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 psuedocode:
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]
哪一个会更快? (欢迎客人)
将它拉入两个寄存器,然后回写内容可能是最快的解决方案。 四个存储周期,四条指令,两个寄存器。 假设数据必须开始并返回到公羊,那么你一般无法打败这种方法。
假设你可以为源和目标做记忆,四个xor是每个xor三个周期,12个记忆周期,这是一个明确的失败者。 使用寄存器来避免两个mem操作数只是增加了更多的指令。
你的asm伪代码是6个内存周期。 6条指令一个注册。 四个周期,四个指令两个寄存器可能更便宜。 现在如果你必须做两个存储周期来释放这些寄存器,它将变成6个周期。 在这最后一个将是一个额外的释放寄存器,所以7.6仍然比7和5的指令便宜,比7便宜,指令的大小不计算在内,但增加了内存周期,虽然提取可能以有效的方式完成(在大小合适的块中)。
如果数据已经在寄存器中,那么使用第三个寄存器并执行三条指令tmp = a,a = b,b = tmp就是三个操作三个寄存器并且速度最快。 但是,如果你只是不能备份一个寄存器,那么四个xors会更快。
这就是所有通用的高级视图,有可能是处理器和缓存情况等等,这些可能会使一个解决方案看起来更快,但最终不会因为一次测试而变得更快,而可能总体上取决于情况。
在任何机器上,Xor方法没有任何理由会更快。
两种方法都需要执行两次读取和两次写入,Xor方法具有ALU +内存开销。
在支持寄存器移动消除(例如IvyBridge或更新版本)的处理器上,如果可以使编译器将这些值保存在寄存器中,则最快的方法应该是第一种方法(使用临时变量)(您必须检查生成的程序集确保;确定)。
通过这种方式,不仅可以避免内存访问(尽管后面的写后读操作应该在内部转发,但是您仍然在内存单元中累积了延迟),还可以避免执行延迟。 CPU只需在无序寄存器重命名器中自行切换寄存器的指针。
即使没有移动消除,注册专用移动应该更快。 内存单元必须执行很多限制(冲突检查,高速缓存查找等),更长的管道和更少的带宽才能正常执行。
链接地址: http://www.djcxy.com/p/85891.html