gpt4 book ai didi

c# - XDocument.Load (XmlReader) 的性能很糟糕;来自 Web 服务的 2 MB XML 需要 4 秒才能从流中解析

转载 作者:数据小太阳 更新时间:2023-10-29 02:22:37 27 4
gpt4 key购买 nike

我正在调用一个网络服务,它返回一个大约 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);

PC 已使用 2 年,内存为 4 GB。个人电脑没问题。我在其他 2 台 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);

可能是一个问题,因为 Stream 被“转换”为 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!!!

将流对象中的数据转换为一些有用的数据(如字符串或毫秒)需要那么长时间,但为什么呢?

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

最佳答案

行内:

MyXmlReader = XmlReader.Create(stream, settings);

您正在从 Stream 中读取数据,它本质上是一个管道,而不是一个;流还没有所有的数据。我猜 2MB 大约需要 4 秒才能到达网络。

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

关于c# - XDocument.Load (XmlReader) 的性能很糟糕;来自 Web 服务的 2 MB XML 需要 4 秒才能从流中解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8385363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com