Производительность XPath vs DOM

Будет ли кто-нибудь проинформировать меня о каком-то общем сопоставлении производительности между XPath и DOM в разных сценариях? Я прочитал несколько вопросов в SO, например xPath vs DOM API, который имеет лучшую производительность и XPath или querySelector?. Ни один из них не упоминает конкретные случаи. Здесь я мог бы начать с.

  • Никакой итерации. getElementById (foobar) vs//* [@id = 'foobar']. Бывает ли он быстрее, чем последний? Что, если последняя оптимизирована, например./Html/тело/DIV [@ид = 'Foo']/дел [@ид = 'Foobar']?
  • Итерация. getElementByX, затем перейдите через дочерние узлы против XPath, создайте моментальный снимок, затем перейдите через элементы моментального снимка.
  • Используемая ось. getElementByX затем переходите к следующим сиблингам vs//follow-sibling:: foobar.
  • Различные реализации. Различные браузеры и библиотеки реализуют XPath и DOM по-разному. Какая версия браузера XPath лучше?

Как ответ в xPath против DOM API, который имеет лучшую производительность, говорит, что средний программист может испортить себя при реализации сложных задач (например, задействованных нескольких осей) DOM, в то время как XPath гарантированно оптимизирован. Поэтому мой вопрос касается только простых выборов, которые могут быть выполнены в обоих направлениях.

Спасибо за любой комментарий.

Ответы

Ответ 1

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

Ответ 2

На этой странице есть раздел, в котором вы можете запускать тесты для сравнения двух и просматривать результаты в разных браузерах. Например, для Chrome xpath на 100% медленнее, чем getElementById.

Для получения дополнительной информации см. getElementById vs QuerySelector.

Ответ 3

Я согласен с Майклом, что это может быть связано с реализацией, но я бы сказал, что DOM быстрее. Причина в том, что я не вижу возможности оптимизировать анализируемый документ, чтобы ускорить XPath.

Если вы просматриваете HTML, а не XML, специализированный парсер может индексировать все идентификаторы и классы в документе. Это сделает getElementById и getElementsByClass намного быстрее.

С XPath существует только один способ найти элемент этого id... путем перемещения сверху вниз или снизу вверх. Вы можете запоминать повторяющиеся запросы (или частичные запросы), но я не вижу никакой другой оптимизации, которая может быть выполнена.