Что является более эффективным для анализа Xml, XPath с XmlDocuments, XSLT или Linq? - PullRequest
28 голосов
/ 08 октября 2008

Я проанализировал XML, используя оба следующих метода ...

  • Анализ XmlDocument с использованием объектной модели и запросов XPath.
  • XSL / Т

Но я никогда не использовал ...

  • Объектная модель Linq Xml, впервые появившаяся в .Net 3.5

Может кто-нибудь сказать мне сравнительную эффективность между тремя альтернативами?

Я понимаю, что конкретное использование будет иметь значение, но я просто хочу приблизительную идею. Например, опция Linq значительно медленнее других?

Ответы [ 4 ]

43 голосов
/ 08 октября 2008

Абсолютно самый быстрый способ запроса XML-документа - самый сложный: напишите метод, который использует XmlReader для обработки входного потока, и попросите его обрабатывать узлы во время их чтения. Это способ объединить разбор и запрос в одну операцию. (Простое использование XPath не делает этого; и XmlDocument, и XPathDocument анализируют документ в их методах Load.) Обычно это хорошая идея, если вы обрабатываете очень большие потоки данных XML.

Все три описанных вами метода работают одинаково. У XSLT есть много места, чтобы быть самым медленным из всего, потому что он позволяет вам сочетать неэффективность XPath с неэффективностью сопоставления с шаблоном. Запросы XPath и LINQ выполняют по существу одно и то же: линейный поиск по перечисляемым спискам узлов XML. Я ожидаю, что LINQ будет немного быстрее на практике, потому что XPath интерпретируется во время выполнения, а LINQ интерпретируется во время компиляции.

Но в целом то, как вы пишете свой запрос, будет иметь гораздо большее влияние на скорость выполнения, чем используемая вами технология.

Способ написания быстрых запросов к документам XML одинаков, независимо от того, используете ли вы XPath или LINQ: сформулируйте запрос так, чтобы во время его выполнения посещалось как можно меньше узлов. Не имеет значения, какую технологию вы используете: запрос, который проверяет каждый узел в документе, будет выполняться намного медленнее, чем тот, который проверяет только небольшое их подмножество. Ваша способность делать это в большей степени зависит от структуры XML, чем что-либо еще: документ с навигационной иерархией элементов, как правило, будет запрашивать намного быстрее, чем тот, чьи элементы все являются дочерними по отношению к элементу документа.

Edit:

Хотя я почти уверен, что прав, что самый быстрый способ запроса XML - самый сложный, самый быстрый (и самый сложный) способ не использует XmlReader; он использует конечный автомат, который непосредственно обрабатывает символы из потока. Подобно синтаксическому анализу XML с помощью регулярных выражений, это обычно ужасная идея. Но это дает вам возможность обмениваться функциями для скорости. Решив не обрабатывать те фрагменты XML, которые вам не нужны для вашего приложения (например, разрешение пространства имен, расширение символьных сущностей и т. Д.), Вы можете создать что-то, что будет проходить через поток символов быстрее, чем XmlReader , Я могу думать о приложениях, где это даже неплохая идея, хотя о многих я не могу думать.

3 голосов
/ 08 октября 2008

Запросы LinqToXml работают против контракта IEnumerable ... большинство его операций - O (N), потому что они требуют итерации по IEnumerable.

Если вы начинаете с строки, содержащей xml, для работы с ней в Linq вам необходимо проанализировать ее в полном графе объектов, используя XElement.Parse , а затем выполнить итерацию его части (например, для фильтрации).

Насколько я понимаю, XPath будет фильтровать при анализе, что может быть очень полезно с точки зрения производительности. Полный граф объектов не нужно строить.

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

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

Существует также способ реализации решения LINQ с помощью комбинации XmlReader, чтобы вы могли с легкостью использовать LINQ. Также вы можете получить гораздо лучшую производительность, чем XmlDocument / XPath.

Пожалуйста, обратитесь к следующей ссылке для получения дополнительной информации по этому вопросу. http://blogs.msdn.com/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx

Также я думаю, что если вы работаете только с небольшими XML-файлами, использование XmlDocument / XPath не будет проблемой производительности.

2 голосов
/ 08 октября 2008

Я на самом деле не тестировал его, но Linq - это, прежде всего, функция компилятора типа кода, поэтому она должна быть сопоставима с использованием запросов XmlDocument и XPath.

Основное значение Linq заключается в том, что он обеспечивает проверку операторов запроса во время компиляции, которую не могут обеспечить ни XPath, ни XSLT.

Я думаю, что если производительность является проблемой, ваше решение будет основываться на поставленной задаче. Например, получение одного значения из документа XML может быть быстрее всего с использованием одного запроса XPath, но преобразование данных XML в страницу HTML будет быстрее с использованием XSLT.

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