Абсолютно самый быстрый способ запроса 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
, Я могу думать о приложениях, где это даже неплохая идея, хотя о многих я не могу думать.