我正在优化一个自定义对象-> XML 序列化实用程序,这一切都已完成并且可以正常工作,这不是问题所在。
它通过将文件加载到XmlDocument
对象中,然后递归地遍历所有子节点来工作。
我想也许使用XmlReader
而不是XmlDocument
加载/解析整个事情会更快,所以我也实现了那个版本。
算法完全相同,我使用包装类来抽象处理 anXmlNode
与 an的功能XmlReader
。例如,GetChildren
方法 yield 返回一个 childXmlNode
或一个 SubTree XmlReader
。
因此,我编写了一个测试驱动程序来测试这两个版本,并使用了一个重要的数据集(一个 900kb 的 XML 文件,包含大约 1,350 个元素)。
但是,使用 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);
}
}
该测试适用于单个级别(即宽和浅)的许多对象 - 但我想知道XmlReader
当 XML 深和宽时票价如何?即我正在处理的 XML 很像一个数据对象模型,1 个父对象到许多子对象,等等:1..M..M..M
我事先也不知道我正在解析的 XML 的结构,所以我无法对其进行优化。