有没有办法让XDocument节省更快

时间:2015-10-17 19:44:36

标签: c# xml

我正在尝试将xml写入文件usng XDocument。以前我使用FileStream写入文本文件,它曾经快速工作。

使用Profiler,我发现XDcoument.Save占用了大约90%的时间,特别是当我在xml节点中编写大文本时。

XDocument xDocument = XDocument.Load(FilePath);
            XElement root = xDocument.Element("logs");
            root.Add(
                     new XElement(
                         "log",
                         new XElement(
                             "dt",
                             DateTime.Now.ToString("MMM dd, yyyy")),
                         new XElement(
                             "tm",
                             DateTime.Now.ToString("HH:mm:ss.fff")),
                        new XElement(
                            "st",
                            ConvertStackTrace(stackList)
                            //stackInfo
                            ),
                         new XElement(
                             "t",
                             topic),
                         new XElement(
                             "d",
                             description),                            
                         new XElement(
                             "cu",
                             custom)));
            xDocument.Save(FilePath);

还有另一种方法可以比这更快地将xml写入文件。请注意,该文件大约为1MB,每次打开文件并将节点添加到其中。

1 个答案:

答案 0 :(得分:2)

基本上有三种方法可以在.NET中执行XML文件

  • XmlTextReaderXmlTextWriter - 用于处理.NET中XML文件的最低级API。它提供对xml数据的流式访问。

  • XmlDocument - 提供XML的DOM表示,便于读取/修改数据

  • XDocument - 提供XML的DOM表示并支持LINQ to XML查询

XDocumentXmlDocument都在场景后面使用XmlReader / XmlWriter。两者都将所有数据保存在内存中,因此显然它们更慢且占用更多内存。你无能为力,因为每次调用你的代码时,必须解析整个xml文档,然后再将其转储到磁盘上。

如果您从XDocument切换到XmlReader / XmlWriter,您可以获得明显更好的性能(猜测速度快5倍-10倍),但需要一些工作来处理文档XmlReader / XmlWriter并不像XDocument

那么简单

根据您的使用情况,您还可以使用一些“令人讨厌”的技巧,例如只为每个日志写一个xml片段。这样您就不必解析文档,只需将片段附加到文件末尾即可。速度与使用纯文本文件相当。缺点 - 生成的文件不是有效的XML,因为它没有任何根元素。使用代码中的此类文件很容易,但外部程序可能无法正常工作。