2012-03-23 27 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的花费要高出几个数量级。第二次检索属性时,大部分工作都会完成,并且会很快,只是缓存数据的对象初始化。

您通常只读取一次属性,可能是几次。所以成本主要由昂贵的第一次,你使用的代码很重要。继续并分析它。只要确保你不把那种昂贵的第一次视为“实验性错误”。