- From: Francois Remy <fremycompany_pub@yahoo.fr>
- Date: Fri, 1 Aug 2008 00:00:28 +0200
- To: "Boris Zbarsky" <bzbarsky@MIT.EDU>
- Cc: "CSS 3 W3C Group" <www-style@w3.org>
From: "Boris Zbarsky" <bzbarsky@MIT.EDU>
Sent: Thursday, July 31, 2008 10:58 PM
To: "Francois Remy" <fremycompany_pub@yahoo.fr>
Cc: "CSS 3 W3C Group" <www-style@w3.org>
Subject: Re: CSS Selector Complexity : Working draft document
> Francois Remy wrote:
>> - Loop Complexity (or static complexity: time needed to find matching
>> elements at load time)
>
> As I said in my other mail, this is not an interesting metric for a
> rendering engine (unless you're implementing querySelectorAll). During
> load time the question that's asked (repeatedly) is not "which elements
> match this selector?" but "which selectors match this element, so that I
> can apply the relevant style rules?"
It's not the good way to do the things to do it "revertly", I think.
SAMPLE 1 :
=================================
Consider "span *" and this document :
- <html>
- <body>
- <div>
- <span>
- <b>
- <div>
- <div>
- <div>
- <div>
If we do it revertly, we must check 9 elements (the whole tree) because all
can match "*".
After that, with all childs, we must check each parent until we reach HTML
to see if there's a SPAN element.
>>> If I don't make an error, we have 26 checking steps (all parents of all
>>> elements except for B that have a SPAN parent before the end).
If we do it as I think, we must find a SPAN element (it's easy because most
browsers are maintaining a TAG dictionnary that contains each element of the
document grouped by tagName) and check all childs of the matching SPAN
element.
>>> We have here only 2 checking steps (SPAN and B)
How does Gecko to be quicker than a browser that use the "logical" order to
find matched elements ?
SAMPLE 2 :
=================================
The only one selector I found that can give the advantage to this way to
find the elements is : " * * ".
On the same document as before :
>>> Logical way : 31 elements checked
>>> Reverted way : 17 elements checked
But it's more usual to have a selector of first type than of second type, I
think.
But I understand now what you were saying, it's more important that such
performance consideration.
REMARKS :
=================================
I've now catched up why you say :matches is a complex pseudo-class.
In a browser that apply the revert way to find matched elements, it's more
complicated than for the others because you must change of direction of the
matching search during the ":matches" operation.
a b:matches(c) d { ... }
For a browser that use the logical way is very easy to implements, but for a
browser that implements the revert way, we are coming from D and we must
return to D each time we encounter a B to see if he have a C as child. It's
counter productive, in fact.
Can developers of IE, Safari and Opera say if they are using the logical of
the reverted way ?
It's very useful for later discussion. IE probably uses the logical way
since it provides querySelector.
>
>> - Update Complexity (number of times the matched elements can be
>> reevaluated * time it need)
>
> My previous post broke this down in what I think is a more useful way.
>
>> * I voluntary excluded the optimizations that can be done by the UA
>> because they are probably not the same
>
> But the space of possible optimizations is in fact key... The question is
> always what the fastest smallest way is to implement something.
>
> -Boris
Received on Thursday, 31 July 2008 22:01:09 UTC