Silverlight. Разбор руками против отражения - PullRequest
0 голосов
/ 23 декабря 2010

Насколько медленнее будет работать браузерное приложение Silverlight, если я буду использовать Reflection вместо того, чтобы вручную анализировать каждое значение XML для классов?

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);
    }
}

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

OK.Это глупо ... но ... Да.Существуют веские причины использовать такую ​​сериализацию / десериализацию.Первый вариант, безусловно, быстрее второго ... но здесь так много можно сказать ...

Прежде всего, .Net уже имеет два метода сериализации XML, которые вы можете использовать.Они оба, вероятно, будут быстрее, чем ваш подход.Посмотрите на XmlSerializer и DataContractSerializer .Не изобретай велосипед.Используйте то, что уже есть.

Затем ваш собственный код для второго варианта может быть значительно ускорен за счет кэширования отображений на основе метаданных.Сделайте отражение один раз, а затем используйте таблицу поиска при десериализации.

Что подводит меня к следующему пункту: если вы делаете это только один раз, разница незначительна.Вы не заметите это вообще.Если вы делаете это тысячи раз, техника, основанная на отражении, гарантированно будет медленнее ... насколько?Время и узнай.

В конечном счете, хотя, если вы не сделаете его более эффективным, синхронизация - пустая трата времени, ИМО.

НО, эффективное использование декларативной сериализации / десериализации является отличнымподход в моем опыте.Это значительно снижает сложность вашего кода, который стоит много.Я вернусь к своей первой точке.Не изобретай велосипед.Если возможно, используйте один из двух существующих механизмов.

2 голосов
/ 23 декабря 2010

Предположим, что вызов отражения может занять до 1 мс (он должен быть быстрее).Это означает, что вы потенциально можете сделать 1000 вызовов на отражение в секунду.Когда вы выполните профилирование, вы обнаружите, что это больше похоже на микросекунды на вызов, что должно быть достаточно быстро для тех 60 раз в секунду, которые вы указали.

1 голос
/ 23 декабря 2010

если переписать то, что у вас есть, вы можете избавиться от большей части времени, необходимого для размышления.

    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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...