- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Sat, 09 Jan 2010 12:20:41 -0800
- To: Nikita Popov <privat@ni-po.com>
- CC: www-style list <www-style@w3.org>
Nikita Popov wrote:
> Am 09.01.2010 06:38, schrieb Andrew Fedoniouk:
>> Tab Atkins Jr. wrote:
>>> On Fri, Jan 8, 2010 at 10:49 PM, Andrew Fedoniouk
>>> <news@terrainformatica.com> wrote:
>>>> Boris Zbarsky wrote:
>>>>> On 1/8/10 12:33 PM, Nikita Popov wrote:
>>>>>> Which would lead to 3^4 = 81 rules. Hopefully nobody does it.
>>>>> Sure they will. That's just life.
>>>>>
...
>>> It is similarly simple to say
>>>
>>> #publications.special :matches(input,select,textarea) {
>>> //new rules
>>> }
>>>
>>> With the same effect.
>>>
>>
>> No. Effect is not the same. For each of 1000 DOM elements you should
>> execute at least following check:
>>
>> if( element.tag == input ||
>> element.tag == select ||
>> element.tag == textarea )
>>
>> So in total at least 3000 checks by introducing just one (as author
>> will think) CSS rule. Yes, element.tag == input is a cheap operation
>> but still it should be made.
> And now it gets really wrong. If the rendering engines would really do
> that, oh my god!
They do so you can start to pray already.
> Sure enough the rendering engines would first jump to the ID
> #publications (which is fast, cause it's a lookup, not a loop), check
> that the class is .special (again a lookup, therefore fast) ans only
> then check for one of the children being a form-interaction-element. So,
> not 3000 checks, but only 302, as many as with your @set-variant!
>
You are wrong in your assumptions of how all this work.
You have defined very non-effective schema of matching CSS selectors
that has complexity of O(N*N) (see:[1]) at least.
For testing any given DOM element for the selector:
.parent .child { ... }
following steps should be made:
1) check if the element has .child class. If no -> exit(false).
That is O(1) operation.
2) check if it has parent element that has .parent class defined. If no
-> exit(false).
That is O(D) operation. D here is a depth of the DOM tree.
So the whole task is of O(N*D) complexity. N here is a number of DOM
elements. No matter how many descendant groups in the selectors.
E.g. this selector:
.super-parent .parent .child { ... }
has also complexity O(N*D)
And in the way you suspect how it works:
1) Find .parent DOM element - O(N) operation.
2) Find .child DOM element inside it - O(N) operation.
In total: O(N*N)
And for the selector:
.super-parent .parent .child { ... }
complexity in your case will be: O(N*N*N).
[1] http://en.wikipedia.org/wiki/Big_O_notation
--
Andrew Fedoniouk.
http://terrainformatica.com
Received on Saturday, 9 January 2010 20:20:16 UTC