Производительность: XDocument против XmlDocument - PullRequest
18 голосов
/ 08 декабря 2010

Я прочитал сравнение между двумя здесь . Это в первую очередь вопрос производительности, касающийся как памяти, так и скорости.

У меня есть несколько XML-документов размером от 100 до 300 К. Я заметил, что есть некоторая задержка при загрузке этой информации в XDocument, а не XmlDocument объект.

  • Есть ли серьезная разница в производительности между этими двумя объектами?
  • Они по-разному обращаются к содержимому XML?
  • При работе со строкой XML, что является предпочтительным, или есть ли разница?

Конечное использование этих объектов - запуск запросов (XPath или LINQ, в зависимости от) к рассматриваемому объекту.

Ответы [ 3 ]

20 голосов
/ 30 декабря 2010

XmlDocument является чисто управляемой реализацией объектной модели документа.Нет взаимодействия с какими-либо компонентами COM, такими как библиотека MSXML.Любое утверждение в противном случае является полностью поддельным.Весь набор API-интерфейсов XLinq стал более дружественным способом взаимодействия с XML с введением LINQ в .NET Framework.

Если вы пытаетесь максимизировать производительность и удобны при использовании XPath, попробуйте использовать XmlDocumentи используя скомпилированные выражения XPath .

5 голосов
/ 19 августа 2015

XmlReader - это самый низкий API в .NET, который все остальные XML API в .NET используют на местах. Естественно, это означает, что с ним сложнее и быстрее. Это потоковый API, поэтому он лучше всего подходит для памяти.

Между XmlDocument и XDocument он же Linq to XML, вот несколько необработанных чисел: http://blogs.msdn.com/b/codejunkie/archive/2008/10/08/xmldocument-vs-xelement-performance.aspx

Оба из них считают XDocument класс более быстрым / более эффективным. Производительность / эффективность программиста также не следует игнорировать. Лично мне легче работать с XDocument.

0 голосов
/ 27 сентября 2018

Я написал тестовую скрипку.И это выглядит так:

var str = "some xml here";
string x = null;

// TEST 1
var el = XElement.Parse(str);

for (int i = 1; i < 1000000; i++)
{
    x = el.Element("EL1NAme").Element("InnerELNAme").Value;
}

Console.WriteLine(x);

// TEST 2
var readerSettings = new XmlReaderSettings() { DtdProcessing = DtdProcessing.Prohibit, XmlResolver = null };

XmlDocument doc = new XmlDocument();
using (var xmlReader = XmlTextReader.Create(new System.IO.StringReader(str), readerSettings))
{
    doc.Load(xmlReader);
}

for (int i = 1; i < 1000000; i++)
{
    x = doc.SelectSingleNode("//InnerELNAme").InnerText;
}

В результате этого теста TEST 1 был в 10 раз быстрее.Итак, здесь XElement опередил XmlDocument

...