XDocument.Load (XmlReader)的性能很差;来自Web-Service的2mb XML需要4秒从流解



我正在调用一个webservice,它返回一个大约2MB的xml。

一切都很标准。问题是创建了一个XDocument。

XDocument xdoc = XDocument.Load( XMLReader Object); // takes 4 sec!!!

我正在创建xdoc,因为我使用LINQ to XML读取XML。

Stopwatch s = new Stopwatch();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(MyUri);
System.Net.ServicePointManager.Expect100Continue = false;
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = Poststring.Length;
StreamWriter swriter = new StreamWriter(req.GetRequestStream());
swriter.Write(Poststring);
swriter.Close();
s.Start();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
XmlReader MyXmlReader = null;
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.ValidationType = ValidationType.None;
settings.ConformanceLevel = ConformanceLevel.Document;
Stream stream = response.GetResponseStream();
s.Stop(); 
Debug.WriteLine("stream= response.GetResponseStream(): " + s.ElapsedMilliseconds);
s.Reset();
MyXmlReader = XmlReader.Create(stream, settings);
Debug.WriteLine("Before XDocument.Load(MyXmlReader): " + s.ElapsedMilliseconds);
s.Start();
XDocument xdoc = XDocument.Load(MyXmlReader);
s.Stop();
Debug.WriteLine("Duration: " + s.ElapsedMilliseconds);

这台电脑已经用了2年了,内存为4gb。PC没有问题。我在另外两台pc和笔记本电脑上测试了它,得到了同样的结果。我创建XDocument xdoc的方法只需要很长时间,但为什么呢?

我测试

XDocument xdoc = XDocument.Load(String with path to the same xmlFile on my pc);

用了20毫秒

编辑:这里有一些时间:

stream= response.GetResponseStream(): 5276 Milliseconds

我猜这是时间从服务器到我的电脑

时间:4855

所需时间:XDocument xdoc = XDocument.Load(MyXmlReader);

可能是一个问题,因为它是流被"转换"成XDocument xdoc对象?

编辑2:I just test

HttpWebResponse response = (HttpWebResponse)req.GetResponse();
MemoryStream ms = new MemoryStream();
//responsetime from server to my pc: 6000 ms
Stream stream = response.GetResponseStream(); 
stream.CopyTo(ms); //this operation takes 4000 ms!!!
ms.Position = 0;
XDocument x4 = XDocument.Load(ms);// this takes 13 ms!!!

将流对象中的数据转换为一些有用的数据(如string或ms)需要很长时间,但为什么呢?

我是否正确,所有来自Web-service的数据都100%发送并到达,然后才执行下一行代码?还是stream. copyto (ms)在一个打开并仍在接收数据的流上操作?

行内:

MyXmlReader = XmlReader.Create(stream, settings);

您正在读取Stream,这实际上是一个管道,而不是;流还没有所有这些数据。我猜2MB大约需要4秒才能到达。

如果太长,请确保在http连接上启用了gzip/deflate。正如oberfreak所指出的,还有其他更适合大型文档的数据格式(xml在大型文档中可能会变得笨拙,尽管它通常可以工作)。

相关内容

  • 没有找到相关文章

最新更新