Советы по оптимизации производительности XML на WP7 - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть приложение на телефоне, и оно занимает около 50 страниц XML, в каждом XML содержится около 100 узлов.Так что, если вы делаете математику, которая составляет около 5000 узлов, я разбираю.Иногда эти узлы не установлены одинаково.Пример: возможно, 75% имеют схему, отличную от других 25%, поэтому есть код для обработки этого и анализа их по-разному.

Я не могу оптимизировать вызовы http больше, чем у меня, как только для веб-службобрабатывать данные по 100 «элементов» за раз, поэтому мне приходится в основном обращаться к веб-службе 50 раз, чтобы получить все страницы данных.Вот процесс высокого уровня.

Call web service (webclient)
Parse XML (take note total pages in xml. it will say Page 1 of 100)
Add results to collection 
Call web service again for page 2 
Parse
Add results to collection 
....rinse and repeat 100 times.

Код синтаксического анализа - действительно единственное место, которое я могу оптимизировать.Все, что я делаю, это использую linq для синтаксического анализа XML и выделения узлов в IEnumerable, а затем я анализирую их и помещаю в пользовательский объект, который я создал.Я ищу идеи высокого уровня о том, как оптимизировать весь этот процесс.Может быть, я что-то упускаю.

Какой-то код ... просто представьте ниже, как 1000 раз или более, и с большим количеством атрибутов, это небольшой пример.Большинство из них имеют около 30 атрибутов, которые нуждаются в разборе. Также у меня нет доступа к реальной схеме и нет контроля над изменениями схемы.

XElement eventData = XElement.Parse(e.Result);
IEnumerable<XElement> feed =
    (eventData.Element("results").Elements("event").Select(el => el)).Distinct();
foreach (XElement el in feed)
{
    _brokenItem = el.ToString();
    thisFeeditem.InternalGuid = Guid.NewGuid().ToString();
    thisFeeditem.ServiceIcon = GetServiceIcon(thisFeeditem.ServiceType);
    thisFeeditem.Description = el.Attribute("displayName").Value;
    thisFeeditem.EventURL = el.Attribute("uri").Value;
    thisFeeditem.Guid = el.Attribute("id").Value;
    thisFeeditem.Latitude = el.Element("venue").Attribute("lat").Value;
    thisFeeditem.Longitude = el.Element("venue").Attribute("lng").Value;
}

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Не видя ваш код, его нелегко оптимизировать.Однако следует учитывать один общий момент:

Linq-to-XML - это анализатор на основе DOM, который считывает весь XML-документ в модель, находящуюся в памяти.Все запросы выполняются против DOM.Для больших документов построение DOM может потребовать много памяти и ресурсов процессора.Кроме того, ваши запросы Linq-to-XML, если они написаны неэффективно, могут перемещаться по одному и тому же узлу дерева несколько раз.

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

0 голосов
/ 06 февраля 2012

Вы можете изменить архитектуру.

Создание веб-службы, которая выполняет сбор и фильтрацию данных XML, а на телефоне извлекает данные из этого веб-службы.

Таким образом, вы переносите тяжелую обработку на (масштабируемый ?!) сервер, и вам нужно изменять службу только при изменении источников XML вместо необходимости обновлять все клиенты.

Вы также можете кэшировать результаты и предотвращать дублирование.

Теперь вы полностью контролируете, что происходит на телефоне.

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