WP7上的XML性能优化提示

时间:2012-02-05 20:37:47

标签: c# silverlight linq windows-phone-7

我在手机上有一个应用程序,它需要大约50页的XML,每个XML大约有100个点头。所以,如果你进行大约5000个节点的数学运算,我正在解析。有时这些节点的设置不一样。示例:可能75%的模式与其他25%的模式不同,因此有代码可以处理它并以不同方式解析它们。

我不能再优化http调用了,因为Web服务一次只提供数据100“项目”,所以我必须基本上点击Web服务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 个答案:

答案 0 :(得分:2)

如果没有看到您的代码,那么优化它并不容易。但是,您应该考虑以下一点:

Linq-to-XML是一个基于DOM的解析器,它将整个XML文档读入驻留在内存中的模型。所有查询都是针对DOM执行的。对于大型文档,构造DOM可能是内存和CPU密集型的。此外,如果写入效率低下,则Linq-to-XML查询可以多次导航相同的树节点。

作为替代方案,请考虑使用类似XmlReader的串行解析器。这种类型的解析器不会创建基于内存的文档模型,并且只以向前的方式操作,迫使您只读取一次元素。

答案 1 :(得分:0)

您可以更改架构。

创建一个Web服务,用于收集和过滤XML数据,并在手机上检索该Web服务中的数据。

通过这种方式,您可以将繁重的处理移动到(可扩展的?!)服务器,只需在XML源更改时修改服务,而不必更新所有客户端。

您还可以缓存结果并防止重复。

现在您可以完全控制手机上发生的事情了。