2017-04-05 65 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

@コルパコフアレクセイ它取決於?在這種情況下,使用按位操作沒有意義。你六次閱讀這些字段,進行三次操作,並將它們寫入三次,在那裏你可以只做兩次讀和兩次寫操作。但是,按位操作可以加速某些代碼,特別是在允許避免分支時 –