2016-02-05 88 views
-8

我一直在尋找運算符重載的C#基本的例子:C#運算符重載性能

public static Vector operator + (Vector lhs, Vector rhs) 
{ 
    Vector result = new Vector(lhs); 
    result.x += rhs.x; 
    result.y += rhs.y; 
    result.z += rhs.z; 
    return result; 
} 

,我想知道,性能方面會是重載+操作這樣的是一回事嗎?

public static Vector operator + (Vector lhs, Vector rhs) 
{ 
    Vector result = new Vector(); 
    result.x = rhs.x + lhs.x; 
    result.y = rhs.y + lhs.y; 
    result.z = rhs.z + lhs.z; 
    return result; 
} 

與第一個和第二個例子有什麼不同嗎?什麼是最好的解決方案,爲什麼?

+7

爲什麼你要問我們嗎?嘗試一下,剖析它,看看它是否足夠滿足您的用例,完成。 – Luaan

+2

如果您可以在'a + = b;'和'a = a + b'之間測量任何差異,我會感到非常驚訝; – Falanwe

+1

現在不用擔心它,使其工作,使其可讀,如果後來你發現它是性能瓶頸,然後擔心它。這是一個*過早的優化*。 *(我相信不會有任何性能差異,即使存在,也可以忽略不計)*。 – Habib

回答

3

你的第二個方法是實際寫入錯誤:您要添加的rhs一切的.x財產。我會假設這是一個簡單的錯誤,而你打算在兩種方法之間有相同的行爲。

這兩個示例調用不同的構造函數重載,您沒有包含代碼。如果我們可以假設第一個示例的構造函數只是爲該對象設置了x,yz屬性,那麼唯一的區別應該是第一個需要從.x,.y.z屬性中加載該屬性設置它們,所以它的性能會稍微慢一些。

但是,這種性能差異可以忽略不計,因此除非這是性能至關重要的代碼片段,否則您最好將重點放在可讀性上。

就個人而言,我應該這樣做:

public Vector(int x, int y, int z) 
{ 
    this.x = x; 
    this.y = y; 
    this.z = z; 
} 

public static Vector operator + (Vector lhs, Vector rhs) 
{ 
    return new Vector(
     rhs.x + lhs.x, 
     rhs.y + lhs.y, 
     rhs.z + lhs.z; 
    ); 
} 
+0

你必須檢查IL以確保。我敢打賭,沒有任何區別。 –

+0

@PanagiotisKanavos:我不認爲我需要檢查IL來確定這個問題。假設構造函數克隆了給定向量中的所有屬性,那麼需要讀取屬性一次並設置屬性一次。然後代碼的其餘部分需要從該向量讀取屬性以及'rhs'並再次設置結果向量的屬性。這就是每個屬性的三次讀取和兩次寫入。第二個例子涉及兩次讀取和兩次寫入。我建議的代碼涉及兩個讀取和一個寫入。 – StriplingWarrior

+0

編譯器可以很容易地對此進行優化。 –

3

語義可讀性,例如2

任何性能差異可以忽略不計,在最壞的情況

+0

你爲什麼要考慮清潔一個?它使用了一些奇怪的拷貝構造函數,然後在簡單的運算符就足夠時使用複合運算符來改變它獲得的結構。我沒有看到使它更清潔的標準。 – Falanwe

+0

@Falanwe這是相同的操作少字符。我寧願寫'result + = add'而不是'result = result + add'。然而,我並沒有考慮代碼中的Vector(lhs)與Vector()這個部分,因爲我只關注表達式本身(因爲它問什麼解決方案是最好的)。說,我已經刪除了這個聲明(「更清晰的代碼」可能不是我想要描繪的)。 – 2016-02-05 16:19:00

+0

我不想被嚇倒,但我覺得這很容易讓人誤解,即使不是完全荒謬的「衡量」乾淨的代碼「,」它有幾個字符?「。 – kai