我正在优化一个自定义对象到XML序列化的工具,它已经全部完成且可用,这不是问题。
它通过将文件加载到XmlDocument
对象中,然后递归遍历所有子节点来实现。
我想也许使用XmlReader
而不是让XmlDocument
加载/解析整个文件会更快,所以我也实现了那个版本。
算法完全相同,我使用一个包装器类来抽象处理XmlNode
和XmlReader
的功能。例如,GetChildren
方法返回一个子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
的表现如何?也就是说,我处理的XML非常像数据对象模型,一个父对象有许多子对象,以此类推:1..M..M..M
另外,我事先不知道正在解析的XML的结构,所以无法为其进行优化。
GetChildren
方法返回一个XmlReader
?你的意思是,每次处理子节点时都要调用XmlReader.Create()
吗? - Robert RossneyXmlReader
的代码都不使用ReadSubtree
,所以这是一个错误的比较。此外,您需要为xr
使用using
块。 - John Saunders