我必须阅读位于网站上的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()方法首次阅读速度慢,但每次下一次阅读速度都快?如何加快这种方法?我应该添加任何代码改进吗?
答案 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)
我认为垃圾收集器将数据保存在内存中