Производительность: XDocument против XmlDocument
Теперь я понимаю, что раньше здесь задавался такой вопрос (особенно этот, который, я думаю, является очень хорошим описанием двух объектов). Мой вопрос больше касается производительности. У меня есть несколько XML-документов размером более 100 - 300 Кбайт. Я заметил, что при загрузке этой информации в XDocument
а не XmlDocument
объект. Есть ли серьезная разница в производительности между этими двумя объектами? Они по-разному обращаются к содержанию XML? При работе со строкой XML, которая является предпочтительной, или есть разница. Конечное использование этих объектов - запуск запросов (XPath
или LINQ, в зависимости) от рассматриваемого объекта.
Опять же, это в первую очередь вопрос производительности, касающийся как памяти, так и скорости.
4 ответа
XmlDocument является чисто управляемой реализацией объектной модели документа. Нет взаимодействия с какими-либо компонентами COM, такими как библиотека MSXML. Любые претензии в противном случае являются полностью поддельными. Весь набор API-интерфейсов XLinq стал более удобным способом взаимодействия с XML с введением LINQ в.NET Framework.
Если вы пытаетесь максимизировать производительность и вам удобно использовать XPath, попробуйте использовать XmlDocument и использовать скомпилированные выражения XPath.
XmlReader
является самым низким API в.NET, который все остальные XML API в.NET используют на местах. Естественно, это означает, что с ним труднее, а также быстрее. Это потоковый API, поэтому он лучше всего подходит для памяти.
Между XmlDocument
а также XDocument
Линк к XML, вот некоторые необработанные цифры: http://blogs.msdn.com/b/codejunkie/archive/2008/10/08/xmldocument-vs-xelement-performance.aspx
Оба из которых находят XDocument
класс быстрее / эффективнее. Производительность / эффективность программиста также не следует игнорировать. Лично мне легче работать с XDocument
,
Если кто-то еще ищет ответ... Мне удалось самостоятельно провести сравнительный анализ. Кажется, что XDocument существенно превосходит XmlDocument. Конечно, у вас может возникнуть соблазн привлечь к этому XmlReader, но это тема для другого раза.
Вот мой крошечный результат теста: https://github.com/zulimazuli/dotnetXmlBenchmarks
Я написал тестовую скрипку. И это идет так
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