允许交换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
与对象xor对象xour会更快吗?
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]
其中哪一项会更快? (Guestimates welcome)
答案 0 :(得分:3)
将其拉入两个寄存器然后回写交换内容可能是最快的解决方案。四个存储周期,四个指令,两个寄存器。假设数据必须开始并返回ram,那么你通常无法击败这种方法。
假设你可以为源和目的地做内存的四个xors是每个xor三个周期,12个内存周期,这是一个明确的输家。使用寄存器来避免两个mem操作数只需添加更多指令。
你的asm伪代码是6个内存周期。 6个指令一个寄存器。四个周期,四个指令两个寄存器可能更便宜。现在,如果你必须做两个存储器周期来释放这些寄存器,它就会变成6个周期。最后一个是另外一个释放寄存器,所以7. 6仍然比7便宜,5个指令比7便宜,指令大小没有在这里计算,但增加了内存周期,虽然取得很可能以有效的方式进行(在大小合适的对齐块中。)
如果数据已经在寄存器中,那么使用第三个寄存器并执行三个指令tmp = a,a = b,b = tmp是三个操作三个寄存器并且最快。但是,如果你只是无法使用寄存器,那么四个xors就会更快。
这是一个通用的高级视图,有可能是处理器和缓存情况等,可以使一个解决方案看起来更快,但最终对于一个测试肯定更快,但通常可能取决于具体情况。
答案 1 :(得分:3)
在任何机器上都没有理由让Xor方法更快。
两种方法都需要执行两次读取和两次写入,并且Xor方法具有ALU +内存开销。
答案 2 :(得分:1)
在支持寄存器移动消除的处理器上(例如 - IvyBridge或更晚代),如果你能让编译器将这些值保存在寄存器中,那么最快的方法应该是第一个(使用临时变量)(你和# 39; ll必须检查生成的程序集以确保)。
这样你不仅可以避免内存访问(虽然写后读取应该在内部转发,但你仍然在内存单元中累积延迟),你也可以避免执行延迟。 CPU只需在无序寄存器重命名器中切换寄存器本身的指针。
即使没有移动消除,仅寄存器移动应该更快。内存单元有许多限制,它必须强制执行(冲突检查,缓存查找等),管道更长,带宽更少,而且是常规执行。