2012-03-23 97 views
0

任何人都知道什麼是最好的用來讀取XmlEnumAttributeGetMember VS在C#getfield命令性能

選擇1:GetMember

public static string XmlEnum(this Enum e) 
    { 
     Type type = e.GetType(); 
     MemberInfo[] memInfo = type.GetMember(e.ToString()); 
     if (memInfo != null && memInfo.Length > 0) 
     { 
      object[] attrs = memInfo[0].GetCustomAttributes(typeof(XmlEnumAttribute), false); 
      if (attrs != null && attrs.Length > 0) 
      { 
       return ((XmlEnumAttribute)attrs[0]).Name; 
      } 
     } 
     return e.ToString(); 
    } 

方案2:通過getfield命令

public static string XmlEnum2(this Enum e) 
    { 
     Type type = e.GetType(); 
     FieldInfo info = type.GetField(e.ToString()); 
     if (!info.IsDefined(typeof(XmlEnumAttribute), false)) 
     { 
      return e.ToString(); 
     } 
     object[] attrs = info.GetCustomAttributes(typeof(XmlEnumAttribute), false); 
     return ((XmlEnumAttribute)attrs[0]).Name; 
    } 
+6

爲什麼不嘗試10萬次,看看每次需要多長時間? – 2012-03-23 10:56:24

+2

無論哪一個更快,都不可能在任何程序中產生可衡量的差異。 – 2012-03-23 11:14:25

回答

5

爲什麼不嘗試10萬次,看看每種情況需要多長時間?

因爲不測試的屬性,一個現實的使用場景。這是昂貴的第一當你挖掘一個屬性,便宜之後。費用是爲屬性類加載IL並編譯它,在屬性元數據中查找屬性數據並從磁盤加載它。然後調用屬性構造函數並分配屬性屬性。讀取屬性的代碼花費與花生相比是花生,而磁盤I/O的花費要高出幾個數量級。第二次檢索屬性時,大部分工作都會完成,並且會很快,只是緩存數據的對象初始化。

您通常只讀取一次屬性,可能是幾次。所以成本主要由昂貴的第一次,你使用的代碼很重要。繼續並分析它。只要確保你不把那種昂貴的第一次視爲「實驗性錯誤」。