【发布时间】:2010-12-03 01:38:10
【问题描述】:
我正在优化一个自定义对象 -> XML 序列化实用程序,一切都已完成并且可以正常工作,这不是问题。
它通过将文件加载到XmlDocument 对象中,然后递归遍历所有子节点来工作。
我想也许使用XmlReader 而不是XmlDocument 加载/解析整个事情会更快,所以我也实现了那个版本。
算法完全相同,我使用包装类来抽象处理XmlNode 与XmlReader 的功能。例如,GetChildren 方法 yield 返回子树 XmlNode 或子树 XmlReader。
所以我编写了一个测试驱动程序来测试这两个版本,并使用了一个重要的数据集(一个包含大约 1,350 个元素的 900kb XML 文件)。
但是,使用 JetBrains dotTRACE,我看到XmlReader 版本实际上比XmlDocument 版本慢!当我遍历子节点时,XmlReader 读取调用似乎涉及一些重要的处理。
所以我说了这么多来问这个:
XmlDocument 和XmlReader 的优点/缺点是什么,在什么情况下应该使用它们?
我的猜测是有一个文件大小阈值,XmlReader 在性能上变得更经济,并且内存密集型更少。但是,该阈值似乎高于 1MB。
我每次都调用ReadSubTree来处理子节点:
public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
XmlReader xr = myXmlSource.ReadSubtree ();
// skip past the current element
xr.Read ();
while (xr.Read ())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
该测试适用于单个级别的许多对象(即宽和浅) - 但我想知道当 XML 深和宽时XmlReader 票价如何? IE。我正在处理的 XML 很像数据对象模型、1 个父对象到许多子对象等:1..M..M..M
我也事先不知道我正在解析的 XML 的结构,所以我无法对其进行优化。
【问题讨论】:
-
我一直想知道为什么会有 XmlDocument 和 XmlReader...
-
其实XMLDocument和XMLReader还有另外一种选择。您现在可以使用 LINQ to XML,但实际上 XMLReader 在大多数方面都更有效。
-
等等。您的
GetChildren方法返回XmlReader?你的意思是,每次处理子节点时都调用XmlReader.Create()? -
大多数使用
XmlReader的代码不使用ReadSubtree,所以这是一个不好的比较。此外,您需要为xr设置一个using块。 -
使用后将 XML 文档设为 NULL 或使用 Blocks 在里面使用 xml 文档。
标签: c# xml-serialization xmldocument xmlreader