代码之家  ›  专栏  ›  技术社区  ›  PhilChuang

决定何时使用xmldocument与xmlreader

  •  61
  • PhilChuang  · 技术社区  · 15 年前

    我正在优化一个自定义对象->XML序列化实用程序,所有这些都已完成并正常工作,这不是问题所在。

    它通过将文件加载到 XmlDocument 对象,然后递归地遍历所有子节点。

    我想也许是用 XmlReader 而不是 XML文档 加载/解析整个过程会更快,所以我也实现了这个版本。

    算法完全相同,我使用包装类抽象处理 XmlNode 与一个 XMLRead . 例如, GetChildren 方法yield返回子级 XMLNoad 或子树 XMLRead .

    所以我编写了一个测试驱动程序来测试这两个版本,并使用了一个非常重要的数据集(一个包含大约1350个元素的900kbXML文件)。

    但是,使用JetBrains Dottrace,我看到 XMLRead 版本实际上比 XML文档 版本!似乎有一些重要的处理涉及 XMLRead 当我遍历子节点时读取调用。

    所以我这么说是为了问:

    有哪些优点/缺点 XML文档 XMLRead 在什么情况下你应该使用?

    我猜有一个文件大小阈值 XMLRead 性能更经济,内存占用更少。然而,这个阈值似乎高于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);
        }
    }
    

    这个测试适用于许多单一层次的物体(即宽和浅),但我想知道效果如何 XMLRead 当XML深入和广泛时收费?也就是说,我处理的XML很像一个数据对象模型,一个父对象到许多子对象,等等: 1..M..M..M

    我也不知道我要分析的XML的结构,所以我不能对其进行优化。

    5 回复  |  直到 9 年前
        1
  •  67
  •   Danny Beckett    11 年前

    我一般都看过 不是从最快的角度看 而是来自 内存利用率 观点。对于我在其中使用的使用场景(典型的企业集成),所有的实现都足够快。

    然而,在我失败的地方,有时是惊人的,没有考虑到我正在使用的XML的一般大小。如果你事先考虑一下,你可以省去一些悲伤。

    XML在加载到内存中时会膨胀,至少对于像 XmlDocument XPathDocument . 比如10:1?确切的数量很难量化,但是如果它在磁盘上是1MB,那么它将在内存中是10MB,或者更多。

    使用任何读卡器将整个文档全部加载到内存中的过程。( XML文档 / XPATH文档 )可能会遇到大型对象堆碎片,这最终会导致 OutOfMemoryException s(即使有可用内存)导致服务/进程不可用。

    因为大于85K的对象最终会出现在大对象堆上,并且在DOM阅读器中有一个10:1大小的爆炸,所以在从大对象堆分配XML文档之前,您可以看到它不会花费太多时间。

    XmlDocument 很容易使用。它唯一的缺点是它将整个XML文档加载到内存中进行处理。它使用起来非常简单。

    XmlReader 是一个基于流的读卡器,因此会使您的进程内存利用率总体上变平,但更难使用。

    XPathDocument 它往往是一个更快的、只读的XML文档版本,但仍然会受到内存“膨胀”的影响。

        2
  •  10
  •   dso    15 年前

    XML文档是整个XML文档的内存表示形式。因此,如果您的文档很大,那么它将消耗比使用xmlreader读取它更多的内存。

    这是假设当使用xmlreader时,您逐个读取和处理元素,然后丢弃它。如果您使用xmlreader并在内存中构造另一个中介结构,那么您也有同样的问题,并且您正在破坏它的目的。

    谷歌 SAX versus DOM “了解更多有关处理XML的两个模型之间的差异的信息。

        3
  •  4
  •   Display Name    9 年前

    另一个需要考虑的问题是,对于处理格式不完全的XML,xmlReader可能更健壮。我最近创建了一个客户机,它使用了一个XML流,但是该流没有在某些元素中包含的URI中正确地转义特殊字符。xmldocument和xpathdocument完全拒绝加载XML,而使用xmlReader,我可以从流中提取所需的信息。

        4
  •  0
  •   to StackOverflow    15 年前

    有一个大小阈值,在该阈值下,xmlcondocument将变慢,最终无法使用。但是阈值的实际值将取决于您的应用程序和XML内容,因此没有硬性和快速的规则。

    如果XML文件可以包含大型列表(比如数万个元素),那么您肯定应该使用xmlreader。

        5
  •  0
  •   David V. Corbin    12 年前

    编码差异是因为混合了两种不同的度量。UTF-32每个字符需要4个字节,并且本质上比单字节数据慢。

    如果您查看大型(100K)元素测试,您会发现无论使用何种加载方法,对于每种情况,时间都会增加大约70ms。

    这是一个(几乎)恒定的差异,特别是由每个字符的开销引起的,