2017-04-05 36 views
2

我想在多线程应用程序中进行按位操作。一方面,我知道按位操作速度非常快,但我也听说它会强制应用程序在处理请求时使用单线程方法,从而导致实际性能下降。在多线程应用程序中按位操作较慢吗?

考虑下面的代码:

public void Swap() { 
    var tempObject = new Vector2(y, x); 
    this.x = tempObject.x; 
    this.y = tempObject.y; 
} 

几件事情打扰我在这里。首先 - 我必须创建一个新对象。一个需要处理的对象。其次,我觉得通过y,然后x到构造函数可以使程序员看到这个代码奇迹,如果有一个错字。尽管该代码非常简约,但你明白了。

我想重构,看起来像这样同样的方法:

public void Swap() { 
    this.x ^= this.y; 
    this.y ^= this.x; 
    this.x ^= this.y; 
} 

的好处是,有没有临时变量(虽然我知道统一处理这些相当不错,而无需启动一个巨大的垃圾收集处理) 。它也应该更快。成本是该方法的可读性较差;事实上并不是每个程序员都知道按位命令以及它们做什么,尽管从方法的名称来看它应该是非常明显的。

但它真的更快吗?或者我只是停留在过去,更好的方法是实际创建一个临时变量以获得更好的性能?

回答

0

你不需要创建一个新的对象或做花式的二进制算术来交换两个变量。

public void Swap() 
{ 
    var temp = x; 
    x = y; 
    y = x; 
} 

在这里你有0分配。 temp值只是推入堆栈,这不会给垃圾回收器带来压力。

+0

这个特殊的例子并不重要。总的来说,问题是 - 会不会对性能至关重要的代码产生推动作用,或者让速度放缓?或者根本没有任何效果(例如,在编译器可以清楚地看到发生了什么并为您优化它的情况下)。 –

+1

@コルパコフアレクセイ它取决于?在这种情况下,使用按位操作没有意义。你六次阅读这些字段,进行三次操作,并将它们写入三次,在那里你可以只做两次读和两次写操作。但是,按位操作可以加速某些代码,特别是在允许避免分支时 –