Linq to XML против DOM - PullRequest
5 голосов
/ 13 мая 2009

В одном из приложений, которые мы разрабатываем, мы много обрабатываем XML. В настоящее время мы используем DOM и XPath для большей части обработки, и мы не очень довольны производительностью.

В настоящее время мы рассматриваем вопрос о переносе логики обработки XML в LINQ, и наши первоначальные исследования показывают, что производительность LINQ намного лучше, чем DOM.

Прежде чем вносить эти изменения, я хотел бы знать, что другие думают об этом. Является ли использование LINQ лучшим вариантом? Любые неудобства и т.д ...

Спасибо, Шамика


Большое спасибо за ваши ответы. Я провел несколько тестов производительности и, как и ожидалось, XmlReader выполнил XmlDocument и LINQ. Обратите внимание, что это только для чтения XML.

Также, если вам нужна простота использования LINQ, вы можете реализовать обработку XML LINQ с помощью некоторых функций XmlReader и получить гораздо лучшую производительность, чем XmlDocument. Пожалуйста, обратитесь к "rwwilden" комментарии для получения дополнительной информации.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 13 мая 2009

Использование DOM (т. Е. System.Xml.XmlDocument), вероятно, будет медленнее из-за расширенной поддержки навигации (все эти ссылки начинают складываться), и эти издержки станут более значительными по мере увеличения числа узлов увеличивается.

Более простые объектные модели (System.Xml.Linq.XDocument и System.Xml.XPath.XPathDocument) не имеют таких сложных структур, но допускают навигацию с помощью других средств. Это может увеличить нагрузку на процессор, но сэкономить память.

В конце концов, вам нужно профилировать (время и пространство) в вашем случае, а также учитывать, насколько реально (воспринимается пользователем) это имеет значение.

Но для максимальной производительности не загружайте весь документ в память вообще: используйте System.Xml.XmlReader и System.Xml.XmlWriter и делайте все в потоке. Конечно, это добавляет стоимость разработки.

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

Лично я бы избежал XmlDocument и использовал бы либо XPathDocument (особенно для чтения и запроса с XPath), либо XDocument (особенно для создания), где XmlReader / XmlWriter не дает достаточной производительности повысить, чтобы оправдать.

2 голосов
/ 13 мая 2009

Я не уверен, что вы заметите очень значительное улучшение производительности, используя LINQ2XML вместо DOM / XPath. Как для DOM, так и для LINQ2XML документ, который вы перебираете, представляется в виде дерева в памяти.

Если производительность действительно является проблемой, и у вас довольно большие XML-документы, вы можете взглянуть на элементарную поддержку потоковой передачи XML, которая реализована в рамках (через XStreamingElement). Также проверьте эту команду Microsoft XML запись в блоге .

1 голос
/ 13 мая 2009

Я полагаю, что LINQ -> XML намного проще в использовании, чем DOM. Для меня это более интуитивно понятно и намного легче читать IMO.

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