【譯】改善結構體相等性性能

目錄:http://www.javashuo.com/article/p-ziomynzt-x.htmlhtml

經過重寫 Equals 方法能夠改善結構體相等比較的性能方法。 若是結構體包含引用類型字段(而不是僅僅只有值類型,如 int)。ide

默認狀況下,結構體的相等性是經過對內存中的兩個結構體對象進行逐字節比較來實現並自動肯定的,但只有在結構體不包含任何引用類型的狀況下。性能

當結構體包含引用類型字段時, 會使用反射來比較兩個結構體對象之間的字段,這種基於反射的方法會致使性能下降。測試

下圖顯示了一個僅包含值類型的結構體和另外一個包含引用類型的結構體的默認相等性比較的相對性能。spa

 
具備引用或值類型的性能

【備註】圖表基於執行 10000000 次相等性的性能測試,比較時間以毫秒爲單位。這裏省略了特定的數字, 以便於將注意力集中在相對差別上。code

用於比較的結構體:orm

struct StructWithRefTypesNoOverriddenEquals { public int Age { get; set; } public int Height { get; set; } public string Name { get; set; } } struct StructWithNoRefTypesNoOverriddenEquals { public int Age { get; set; } public int Height { get; set; } } 

重寫 Equals() 來改善性能

若是重寫 Equals 方法來提供自定義的相等性含義,則會使用重寫方法而不是默認(較慢)基於反射的機制:htm

struct StructWithRefTypesAndOverriddenEquals { public int Age { get; set; } public int Height { get; set; } public string Name { get; set; } public override bool Equals(object obj) { if (!(obj is StructWithRefTypesAndOverriddenEquals)) return false; var other = (StructWithRefTypesAndOverriddenEquals)obj; return Age == other.Age && Height == other.Height && Name == other.Name; } // GetHashCode override and == != operators omitted } 

如今,將 StructWithRefTypesNoOverriddenEquals 的性能與 StructWithRefTypesandOverridEquals 的性能進行比較,生成如下結果:對象

 
自定義 .Equals() 實現

實現重寫的 Equals 意味着不會使用反射,而是執行自定義的 .Equals() 代碼來取代原來的方式。blog

【提示】與性能相關的全部內容都同樣,這些性能差別可能與您正在編寫的應用程序相關,也可能與您所編寫的應用程序無關。

章節:Improving Struct Equality Performance
譯書名:《C# 奇淫巧技 -- 編寫更優雅的 C#》
原書名:《C# Tips -- Write Better C#》
網址:https://leanpub.com/cstips

相關文章
相關標籤/搜索