Производительность 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... путем перемещения сверху вниз или снизу вверх. Вы можете запоминать повторяющиеся запросы (или частичные запросы), но я не вижу никакой другой оптимизации, которая может быть выполнена.