【问题标题】:Why DataSet.ReadXml() slow at first reading? How to make it faster?为什么 DataSet.ReadXml() 在第一次阅读时很慢?如何让它更快?
【发布时间】:2015-08-12 09:13:23
【问题描述】:

我必须读取位于网站上的 XML 文件(目前仍然是本地的)。我在 windows 窗体应用程序上使用 C#,我使用以下代码:

try
{
    DataSet dsMain = new DataSet();
    dsMain.ReadXml(txtUrl.Text);
}
catch (Exception exx)
{
    MessageBox.Show(exx.Message);
}

这些代码运行良好,但问题是 dsMain.ReadXml() 方法在第一次连接到网站时速度很慢。为了证明这一点,我用秒表包围它,如下所示:

try
{
    Stopwatch st = new Stopwatch();
    st.Start();
    DataSet dsMain = new DataSet();
    dsMain.ReadXml(txtUrl.Text);
    st.Stop();
    MessageBox.Show(Math.Round(st.Elapsed.TotalSeconds, 2).ToString(), "XML reading cost");
}
catch (Exception exx)
{
    MessageBox.Show(exx.Message);
}

消息框显示第一次加载大约 2-3 秒,在应用程序期间每次读取大约 0-0.01 秒。如果我关闭应用程序并再次运行它,则会再次出现此问题。仅供参考,XML 文件很小(不到 10 KB)。

所以问题是,为什么 DataSet.ReadXml() 方法在第一次阅读时很慢,但在每次阅读时都很快?如何加快这种方法?我应该添加任何代码改进吗?

【问题讨论】:

    标签: c# xml winforms performance


    【解决方案1】:

    第一次很慢,因为运行时动态地生成代码来进行反序列化。

    为避免这种情况,只需将 .NET XML 解析器之一直接用于您自己的针对数据优化的数据结构(DataSet 本身通过动态和通用接口增加了很多开销)。

    【讨论】:

      【解决方案2】:

      可能是因为它试图从 xml 文件中解析(或推断)架构。在稍后阶段(第二次解析文件)它不再创建模式,而只是将数据添加到表中。

      https://msdn.microsoft.com/en-us/library/360dye2a(v=vs.110).aspx

      ReadXml 方法提供了一种从 XML 文档中将数据或数据和架构都读取到 DataSet 中的方法,而 ReadXmlSchema 方法仅读取架构。要同时读取数据和架构,请使用包含 mode 参数的 ReadXML 重载之一,并将其​​值设置为 ReadSchema。

      ...

      如果未指定内联模式,则根据 XML 文档的结构,必要时通过推理扩展关系结构。如果无法通过推理扩展架构以公开所有数据,则会引发异常。

      【讨论】:

        【解决方案3】:

        我想垃圾收集器将数据保存在内存中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-23
          • 1970-01-01
          • 2012-12-08
          • 2023-02-16
          • 2017-10-26
          • 2020-11-11
          • 1970-01-01
          • 2021-08-24
          相关资源
          最近更新 更多