Хороший вопрос на самом деле.
Скажем, вы проанализировали DOM из N элементов максимальной глубины D и CSS из S правил. Тогда задача поиска стилей для всех элементов имеет вычислительную сложность примерно O(N*D*S)
.
Очевидно, что не все селекторы CSS имеют одинаковую сложность вычислений.
Например, li.item
селектор и li[class ~= "item"]
требуют точно таких же ресурсов ЦП, что и их эквиваленты. li[class = "item"]
может быть вычислено быстрее, так как не требует сканирования пробелов.
# 1 селектор здесь:
#myID .myClass{} /* #1 */
.myClass{} /* #2 */
требуется больше ресурсов ЦП, поскольку вам нужно выполнять точно такой же объем работы, что и в случае №2, плюс вам нужно будет сканировать цепочку родительских / дочерних элементов (из элементов максимум D), чтобы найти элемент с «myID».
Это все о чистых селекторах CSS.
В jQuery & friends ситуация может быть несколько иной. Теоретически движок jQuery может использовать document.getElementById()
, чтобы минимизировать набор поиска (поэтому уменьшите число N), но это не будет соответствовать поведению CSS. Вот пример: http://jsfiddle.net/dnsUF/. Здесь jQuery сообщает об одном элементе с #foo
, но на самом деле таких элементов два.
Резюме:
- В случае CSS # 2 быстрее
- В случае jQuery # 1 может быть быстрее (но технически может быть неправильным в смысле CSS).
Вот моя статья о сложности селектора CSS:
http://www.terrainformatica.com/2008/07/csss-and-computational-complexity-of-selectors/
И это один из способов улучшить его, используя наборы стилей:
http://www.terrainformatica.com/2010/09/style-sets-in-h-smile-core/