Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Load(XmlReader)的性能非常糟糕;来自Web服务的2MB XML从流到解析需要4秒_C#_Xml_Performance_Web Services_Stream - Fatal编程技术网

C# Load(XmlReader)的性能非常糟糕;来自Web服务的2MB XML从流到解析需要4秒

C# Load(XmlReader)的性能非常糟糕;来自Web服务的2MB XML从流到解析需要4秒,c#,xml,performance,web-services,stream,C#,Xml,Performance,Web Services,Stream,我正在调用一个webservice,它返回一个大约2MB的xml 一切都很标准。问题是XDocument的创建 XDocument xdoc = XDocument.Load( XMLReader Object); // takes 4 sec!!! 我之所以创建xdoc,是因为我使用LINQtoXML来读取XML Stopwatch s = new Stopwatch(); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(MyU

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

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

XDocument xdoc = XDocument.Load( XMLReader Object); // takes 4 sec!!!
我之所以创建xdoc,是因为我使用LINQtoXML来读取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。电脑没问题。我在另外两台个人电脑和笔记本电脑上进行了测试,得到了同样的结果。我创建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对象而出现问题

edit2:我刚测试过

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!!!
将stream对象中的数据转换为一些有用的数据(如string或ms)需要那么长的时间,但是为什么呢

我说的对吗,来自Web服务的所有数据都是100%发送并已到达的,只有到那时才执行下一行代码?或者stream.copyTo(ms)是否在一个打开的流上运行,并且仍在接收数据?

行中:

MyXmlReader = XmlReader.Create(stream, settings);
您正在从
中读取,该流本质上是一个管道,而不是;流还没有所有这些数据。我猜2MB需要大约4秒钟才能到达


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

您是否测量了在线性能?如果我在家里尝试通过DSL连接从远程主机下载2MB,我不希望它在大约15秒钟内返回。您自己的测试证明问题不是“创建XDocument”…我不这么认为。因为我在测量1)从Web服务器到我的时间和2)XDocument.Load(XmlReader)。我还重置了秒表内的时间。看看这个问题,它可能会帮助你,链接的thx,但我的2MB我认为问题在于streamobject内的数据。不知何故,要把它转换成任何有用的东西需要很长时间。如果我使用stream.CopyTo(memorystream),memorystream上的每个操作都比stream上的操作快100倍。hmmm我已经开始实现gzip/deflate,但是web服务人员也必须实现它。在开始使用XDocument xdoc=XDocument.Load();,之前,如何确保所有数据都在我的电脑上;?所以我可以说,XDocument.Load()需要多长时间;take?@Gero大多数web服务器只需启用gzip/deflate即可支持它;你的问题是。。。你能把它复制到内存流吗<代码>var ms=新内存流();stream.CopyTo(ms);ms.Position=0-但是!!!在没有额外缓冲区的情况下,从流中读取数据要高效得多,因此只需满足自己的时间需求即可。谢谢您的建议。我使用stream.CopyTo(ms)3850ms,然后使用XDocument x4=XDocument.Load(ms);13毫秒。看起来问题在于流对象中的数据。将该流数据转换为有用的数据需要4秒??从Web服务器到我的数据大约需要6秒。@Gero没有“该流的转换”-该流只是通过网络收集数据,与下载文件相同。这需要几秒钟的时间。@Gero不,问题是“通过线路获取数据”,这仅仅意味着你受到带宽的限制。欢迎来到俱乐部;我们都是。如果你想让它更快,有3种选择;a:加快交付速度(支付较粗的管道费用,并确保服务器以该速度提供数据),b:在线压缩数据,或c:发送较少的数据(我相信有人提到protobuf,它的设计比XML更简洁)