为什么DataSet.ReadXml()在第一次阅读时会变慢?如何让它更快?

时间:2015-08-12 09:13:23

标签: c# xml winforms performance

我必须阅读位于网站上的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()方法首次阅读速度慢,但每次下一次阅读速度都快?如何加快这种方法?我应该添加任何代码改进吗?

3 个答案:

答案 0 :(得分:2)

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

为了避免这种情况,只需将.NET XML解析器中的一个直接用于您自己的数据结构,这些数据结构针对您的数据进行了优化(DataSet本身通过动态和具有通用接口而增加了大量开销。

答案 1 :(得分:0)

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

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

  

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

     

...

     

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

答案 2 :(得分:-1)

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