将变量复制到另一个变量的最快方法是什么?

时间:2013-11-08 19:56:58

标签: performance memory copy cpu-registers

假设我有2个变量。

x = 1  
y = 2  

最终结果应为:

x = 2  
y = 1  

我想到了以下方法:

temp = x // clone x
x = y
y = temp

或(XOR交换)

x = x XOR y
y = x XOR y
x = y XOR x

我想得到关于低级别记忆等的答案......
最快的方法是什么?

注意:
我想得到一个额外的答案,假设没有副作用(代码,cpu),这是最快的,还是有其他更快的?

3 个答案:

答案 0 :(得分:6)

问题是现代CPU架构不会让你得到这个答案。它们会隐藏许多效果并会暴露许多非常微妙的效果。

如果你有CPU寄存器中的值并且你有一个备用寄存器,那么temp方式可能是最快的方式,也可能是消耗最少功率的方式。

使用XOR或+/-(非常简洁!)方法适用于您无法承担额外位置(额外内存变量或额外寄存器)的情况。这可能看起来很奇怪,但在C预处理器宏中,不能(轻松地)声明新变量,例如。

当变量在内存中时,所有变体在任何高性能CPU上的行为都很可能相同。即使编译器没有优化代码,CPU也会避免几乎所有的存储器访问,并使它们像寄存器访问一样快。

总的来说,我倾向于说:不要担心速度。在这个级别进行优化并不重要。尽量避免交换,这将是最快的!

答案 1 :(得分:4)

http://en.wikipedia.org/wiki/XOR_swap_algorithm

  

大多数现代编译器都可以优化掉临时变量   天真的交换,在这种情况下,天真的交换使用相同的数量   存储器和与XOR交换相同数量的寄存器并且处于   最快,通常更快。 XOR交换也少得多   任何不熟悉的人都可读并且完全不透明   技术。在现代CPU架构中,XOR技术是   比使用临时变量进行交换要慢得多。   一个原因是现代CPU努力执行指令   并行通过指令管道。在XOR技术中,输入   每个操作取决于前一个操作的结果,所以   它们必须按严格的顺序执行。

另见这个问题:

How fast is std::swap for integer types?

重要的是要注意,XOR交换要求您首先检查两个变量是否不引用相同的内存位置。如果他们这样做了,你最终会把它设置为零。

答案 2 :(得分:1)

XOR交换并不总是最有效的,因为大多数现代CPU架构都尝试并行化指令,但在XOR交换中,每一行都依赖于先前的结果(不可并行化)。对于临时变量交换,大多数编译器都会优化临时变量,最终会以天真的方式运行得更快或更快以及使用相同数量的内存。

另一种交换方式是:

x = x + y
y = x - y
x = x - y

类似地,XOR交换的效率和速度的论据也适用于此。

编辑:正如斧头所说,如果不仔细做,(+/-)方法也会导致溢出