C# Silverlight。手工解析与反射解析

C# Silverlight。手工解析与反射解析,c#,.net,silverlight,C#,.net,Silverlight,如果我使用反射而不是手工将每个XML值解析为类,Silverlight浏览器应用程序的运行速度会慢多少 UPD 下面是一些示例(反射将不同,但非常相似): 手工解析: //... IEnumerable<XElement> XMLProfiles = xmlDocument.Element("response").Elements(xmlDocument.Element("response").Element("user").Name); foreach (XElement use

如果我使用反射而不是手工将每个XML值解析为类,Silverlight浏览器应用程序的运行速度会慢多少

UPD 下面是一些示例(反射将不同,但非常相似):

手工解析:

//...
IEnumerable<XElement> XMLProfiles = xmlDocument.Element("response").Elements(xmlDocument.Element("response").Element("user").Name);

foreach (XElement userElement in XMLProfiles)
{
    this.Id = userElement.Element("UserID").Value;
    this.Name = userElement.Element("someName").Value;
    this.Phone= userElement.Element("mobile").Value;
    // ...
    this.p20 = userElement.Element("someName20").Value;
}
//...
//...
[XmlElement("UserID")]
public string Id  { get; set; }

[XmlElement("someName")]
public string Name{ get; set; }

[XmlElement("mobile")]
public string Phone{ get; set; }

/* other parems */

[XmlElement("someName20")]
public string p20 { get; set; }
//...

public void Load(XDocument data)
{
    XElement XML;
    Type T = this.GetType();
    PropertyInfo[] PI = T.GetProperties();

    foreach (PropertyInfo item in PI)
    {
        var AObj = item.GetCustomAttributes(false);
        XMLProfiles = data.Element("user").Element(((XmlElementAttribute)AObj[0]).ElementName);
        object Value = Parse(item, XML.Value);
            if (Value != null)
                item.SetValue(this, Value, null);
    }
}

假设一个反射调用可能需要1ms的时间(应该比这个快)。这意味着您可能每秒进行1000次反射调用。当您进行分析时,您会发现它更像是每次调用的微秒,对于您指定的每秒60次,它应该足够快。

假设反射调用可能需要1毫秒(应该比这快)。这意味着您可能每秒进行1000次反射调用。当您进行评测时,您会发现它更像是每次调用的微秒,对于您指定的每秒60次来说,这应该足够快了。

好的。这有点傻。。。但是对有充分的理由使用这样的序列化/反序列化技术。第一种选择肯定比第二种快。。。但是这里有很多话要说

首先,.Net已经有两种可以使用的XML序列化技术。它们都可能比你的方法更快。调查一下这个问题。不要再发明轮子了。利用已经存在的东西

接下来,通过缓存基于元数据的映射,您自己的第二个选项的代码可以更快。执行一次反射,然后在反序列化时使用查找表

这就引出了我的下一个观点:如果你只做一次,差别可以忽略不计。你根本不会注意到的。如果你做了数千次,基于反射的技术肯定会更慢。。。多少钱?计时并找出答案

不过,在我看来,如果你不提高工作效率,那么做时间安排就是浪费时间


但是,根据我的经验,有效地使用声明式序列化/反序列化是一种很好的方法。它大大降低了代码的复杂性,这是非常值得的。我将回到我的第一点。不要再发明轮子了。如果可以,请使用两种现有机制之一。

确定。这有点傻。。。但是对有充分的理由使用这样的序列化/反序列化技术。第一种选择肯定比第二种快。。。但是这里有很多话要说

首先,.Net已经有两种可以使用的XML序列化技术。它们都可能比你的方法更快。调查一下这个问题。不要再发明轮子了。利用已经存在的东西

接下来,通过缓存基于元数据的映射,您自己的第二个选项的代码可以更快。执行一次反射,然后在反序列化时使用查找表

这就引出了我的下一个观点:如果你只做一次,差别可以忽略不计。你根本不会注意到的。如果你做了数千次,基于反射的技术肯定会更慢。。。多少钱?计时并找出答案

不过,在我看来,如果你不提高工作效率,那么做时间安排就是浪费时间


但是,根据我的经验,有效地使用声明式序列化/反序列化是一种很好的方法。它大大降低了代码的复杂性,这是非常值得的。我将回到我的第一点。不要再发明轮子了。如果可以,请使用两种现有机制中的一种。

如果重写现有机制,则可以省去反射所需的大部分时间

    Dictionary<PropertyInfo, object[]> PI;
    public void InitClass()
    {
        PI = new Dictionary<PropertyInfo, object[]>();
        Type T = this.GetType();
        PropertyInfo[] propInfos = T.GetProperties();
        foreach (PropertyInfo info in propInfos)
        {
            var AObj = info.GetCustomAttributes(false);
            PI.Add(info, AObj);
        }
    }

    public void Load(XDocument data)
    {
        XElement XML;
        PropertyInfo item;
        object[] AObj;
        foreach (var keyValPair in PI)
        {
            item = keyValPair.Key;
            AObj = keyValPair.Value;
            XMLProfiles = data.Element("user").Element(((XmlElementAttribute)AObj[0]).ElementName);
            object Value = Parse(item, XML.Value);
            if (Value != null)
                item.SetValue(this, Value, null);
        }
    }
字典PI;
公共类()
{
PI=新字典();
Type T=this.GetType();
PropertyInfo[]PropInfo=T.GetProperties();
foreach(PropInfo中的PropertyInfo信息)
{
var AObj=info.GetCustomAttributes(false);
PI.Add(信息,AObj);
}
}
公共无效荷载(XDocument数据)
{
XElement XML;
财产信息项;
对象[]AObj;
foreach(PI中的var键对)
{
item=keyValPair.Key;
AObj=keyValPair.Value;
XMLProfiles=data.Element(“用户”).Element(((xmlementattribute)AObj[0]).ElementName);
object Value=Parse(item,XML.Value);
if(值!=null)
item.SetValue(this,Value,null);
}
}

如果你重写了你所拥有的,你就可以省去大部分反思所需的时间

    Dictionary<PropertyInfo, object[]> PI;
    public void InitClass()
    {
        PI = new Dictionary<PropertyInfo, object[]>();
        Type T = this.GetType();
        PropertyInfo[] propInfos = T.GetProperties();
        foreach (PropertyInfo info in propInfos)
        {
            var AObj = info.GetCustomAttributes(false);
            PI.Add(info, AObj);
        }
    }

    public void Load(XDocument data)
    {
        XElement XML;
        PropertyInfo item;
        object[] AObj;
        foreach (var keyValPair in PI)
        {
            item = keyValPair.Key;
            AObj = keyValPair.Value;
            XMLProfiles = data.Element("user").Element(((XmlElementAttribute)AObj[0]).ElementName);
            object Value = Parse(item, XML.Value);
            if (Value != null)
                item.SetValue(this, Value, null);
        }
    }
字典PI;
公共类()
{
PI=新字典();
Type T=this.GetType();
PropertyInfo[]PropInfo=T.GetProperties();
foreach(PropInfo中的PropertyInfo信息)
{
var AObj=info.GetCustomAttributes(false);
PI.Add(信息,AObj);
}
}
公共无效荷载(XDocument数据)
{
XElement XML;
财产信息项;
对象[]AObj;
foreach(PI中的var键对)
{
item=keyValPair.Key;
AObj=keyValPair.Value;
XMLProfiles=data.Element(“用户”).Element(((xmlementattribute)AObj[0]).ElementName);
object Value=Parse(item,XML.Value);
if(值!=null)
item.SetValue(this,Value,null);
}
}

我们不知道!这取决于你在做什么以及多久一次……请求的最大频率是每秒3次。Som类最多可以有20个参数,那么是什么阻止了你比较计时呢?1)API调用尚未实现2)所有调用都是异步的3)现在是早上6点,我今天没有睡觉:)我想有人有过这样的经验,我们不知道!这取决于你在做什么以及多久一次……请求的最大频率是每秒3次。Som类最多可以有20个paremeters那么停止什么呢