XDocument.Load (XmlReader) имеет ужасную производительность; 2 МБ XML для веб-службы требуется 4 секунды из потока для анализа - PullRequest
3 голосов
/ 05 декабря 2011

Я звоню в веб-сервис, который возвращает XML размером около 2 МБ.

Все вполне стандартно.Проблема заключается в создании 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 года, 4ГБ ОЗУ.ПК в порядке.Я протестировал его на 2 других ПК и ноутбуке и получил те же результаты.Мой способ создания 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!!!

преобразование данных в объекте потока в некоторые полезные данные (как строка или мс) займет много времени, но почему?

Прав ли я, что все данные из Web-сервиса отправлены на 100% и прибыли, и только после этого выполняется следующая строка кода?или stream.copyTo (ms) работает с открытым потоком и все еще получает данные?

1 Ответ

6 голосов
/ 05 декабря 2011

В строке:

MyXmlReader = XmlReader.Create(stream, settings);

Вы читаете из Stream, который по сути является труба , а не ведро ;поток еще не имеет всех этих данных.Я предполагаю, что 2 МБ занимает около 4 секунд, чтобы прийти по проводам.

Если это слишком долго, убедитесь, что вы включили gzip / deflate в подключении http.Как отмечает oberfreak, существуют другие форматы данных, которые больше подходят для больших документов (xml может стать громоздким при больших размерах, хотя в целом это будет работать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...