Почему CSS локаторы работают быстрее чем XPath?

Посмотрел я видео, где рассказывают о CSS vs XPath. 

http://www.youtube.com/watch?v=6vPu3TO6XZ4&feature=channel_video_title

Мне стало интересно, почему практически во всех случаях XPath работает медленее (пуская в доли секунды для FireFox или секунды для Internet Explorer) чем CSS?

когда страница загружается - браузер парсует CSS в любом случае, тогда селениум просто обращается к уже загруженному объекту. когда же речь идет про xpath - HTML парсуется по запросу, но один раз за страницу - так что второй запрос к xpath на странице будет немного быстрее, но все равно не так как CSS. А отсюда уже претензии к разработчикам парсера (не селениум)

у меня нет претензий к селениум :) а на счет загрузки страницы, я думал, что в случае xpath браузер тоже парсит страницу.

так на много понятней, только вот один вопрос, насколько я знаю файерфокс также сразу создает xml дерево в памяти при загрузке странице.

походу полчается, что разработчики CSS технологии намного лучше пишут чем XPath :)

Дело в том, что CSS-локаторы были разработаны специально для HTML, а XPath-локаторы -- это универсальный механизм для поиска по XML DOM.

Поэтому для CSS идентификатор и имя -- это особые атрибуты, он строит табличку-индекс для быстрого обращения к элементам, снабженным этими атрибутами. Поскольку эти атрибуты должны быть уникальными, индексация работает очень эффективно. А с точки зрения XPath -- это "просто атрибуты", поиск ведётся не по таблице-индексу, а по всему DOM-дереву.

Поиск по классу уже не так эффективен, а поиск по контенту в обоих случаях работает без индексации, здесь разница между XPath и CSS незначительна.

Спасибо, я не знал о такой таблице, а где можно больше почитать о ней?

В CSS спецификации даже упомянули "Selectors have been optimized for use with HTML and XML, and are designed to be usable in performance-critical code.". Походу они своего добились.

Что касается id -- это реализовано прямо внутри браузеров, нативными средствами, метод document.getElementById является частью спецификации CSS 2 -- http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-getElBId

Про name надо уже смотреть реализации на JS. Насколько я понял, в этом ролике речь идет про Se1, он использует библиотеку Sizzle, вот там и надо искать.

То что можно использовать метод document.getElementById - понятно, что хотелось найти “строит табличку-индекс для быстрого обращения к элементам”. Так и не нашел.

З.Ы. Интерсные ссылки походу поиска CSS Selectors and Pseudo Selectors and browser support и Purchase Intent Data for Enterprise Tech Sales and Marketing - TechTarget

Я посмотрел на реализации Sizzle и jQuery -- для поиска по имени они обращаются к другой стандартной функции getElementsByName -- http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-71555259 , то есть реализация опять таки нативная, надо искать в коде браузеров. Именно там прячутся эти таблички-индексы.