Closed Bug 1380877 Opened 7 years ago Closed 7 years ago

stylo: Trim some fat from the traversal

Categories

(Core :: CSS Parsing and Computation, enhancement)

enhancement
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: bholley, Assigned: bholley)

References

(Blocks 1 open bug)

Details

Attachments

(3 files, 1 obsolete file)

I have some patches to reduce overhead in the traversal. A major piece of to avoid enumerating the children twice (once during preprocessing, and once from the traversal driver).
https://treeherder.mozilla.org/#/jobs?repo=try&revision=bddfaea9e0eabb734d0496d2989e346d2deb8549 Finally green. This took way longer than I thought to get right.
Attached patch Part 1 - Use Drains in parallel.rs. v1 (obsolete) (deleted) — Splinter Review
Contrary to the comment around its declaration, we do move the SmallVec in the replace call. This fixes that. MozReview-Commit-ID: Bc1qFPpHQ8t
Attachment #8886738 - Flags: review?(emilio+bugs)
In the next patch, we'll move logic to identify the children for traversal into preprocess_children (which will be renamed), and the set_dirty_descendants logic will move along with it. So left as-is, the code here will clobber the flags. MozReview-Commit-ID: 7ZskKWD4QC3
Attachment #8886739 - Flags: review?(emilio+bugs)
MozReview-Commit-ID: DIHXaVNzbFM
Attachment #8886740 - Flags: review?(emilio+bugs)
Comment on attachment 8886738 [details] [diff] [review] Part 1 - Use Drains in parallel.rs. v1 Review of attachment 8886738 [details] [diff] [review]: ----------------------------------------------------------------- I guess, though the code was nicer before...
Attachment #8886738 - Flags: review?(emilio+bugs) → review+
Attachment #8886739 - Flags: review?(emilio+bugs) → review+
Comment on attachment 8886740 [details] [diff] [review] Part 3 - Pass a callback to recalc_style_at to avoid traversing children twice. v1 Review of attachment 8886740 [details] [diff] [review]: ----------------------------------------------------------------- ::: servo/components/style/gecko/traversal.rs @@ +38,3 @@ > { > if node.is_element() { > let el = node.as_element().unwrap(); While you're here, can you change this to: if let Some(el) = node.as_element() { instead? ::: servo/components/style/traversal.rs @@ +117,5 @@ > > /// A DOM Traversal trait, that is used to generically implement styling for > /// Gecko and Servo. > pub trait DomTraversal<E: TElement> : Sync { > /// Process `node` on the way down, before its children have been processed. Please document the new function. @@ +257,5 @@ > debug_assert!(node.is_text_node()); > false > } > > + /// Returns true if traversal is needed for the given element and subtree. Document that the only place parent_data can be None is if there's no parent? @@ +617,5 @@ > + // * This is a reconstruct traversal. > + // * This is a servo non-incremental traversal. > + // > + // Additionally, there are a few scenarios where we avoid traversing the > + // subtree even if the element styles are out of date. These cases are I don't think "the element styles are out of date" is a great description... Maybe just "the children styles"? @@ +778,5 @@ > important_rules_changed > ) > } > > +fn note_children<E, D, F>( I find "note" a very generic name, and it's doing very concrete stuff... Don't have an immediate better suggestion, though I think the previous name is clearer than this (but still not great!)
Attachment #8886740 - Flags: review?(emilio+bugs) → review+
(In reply to Emilio Cobos Álvarez [:emilio] from comment #9) > Comment on attachment 8886738 [details] [diff] [review] > Part 1 - Use Drains in parallel.rs. v1 > > Review of attachment 8886738 [details] [diff] [review]: > ----------------------------------------------------------------- > > I guess, though the code was nicer before... Yeah, fair. I realize now that I could have just kept the old code and emptied the array after borrowing it (rather than doing the replace). But I'd probably still want a try push, and otherwise this is land-ready, so I'm just going to land it. (In reply to Emilio Cobos Álvarez [:emilio] from comment #10) > I find "note" a very generic name, and it's doing very concrete stuff... > Don't have an immediate better suggestion, though I think the previous name > is clearer than this (but still not great!) Well, pre-process isn't really accurate here, because it both preprocesses and passes them to the caller. We can rename it if we think of a better name. Thanks for the reviews!
I had to rebase anyway, so I made this more minimal patch for part 1. I'm going to assume emilio prefers this. :-) MozReview-Commit-ID: 7nzjMwOmszZ
Attachment #8886818 - Flags: review+
Attachment #8886738 - Attachment is obsolete: true
Status: NEW → RESOLVED
Closed: 7 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: