Производительность: XDocument против XmlDocument

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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;
}

Результатом этого теста стало то, что ТЕСТ 1 прошел в 10 раз быстрее. Итак, здесь XElement превзошел XmlDocument