Closed Bug 1356148 Opened 7 years ago Closed 7 years ago

stylo: Coalesce duplicate slow selector flags

Categories

(Core :: CSS Parsing and Computation, defect, P1)

defect

Tracking

()

RESOLVED FIXED

People

(Reporter: bholley, Assigned: bholley)

References

(Blocks 1 open bug)

Details

Attachments

(2 files)

The current setup blows up with the testcase at [1] modified to have the selector of "span + div".

[1] https://hg.mozilla.org/integration/autoland/file/6386d8f32e1d/testing/talos/talos/tests/perf-reftest/bloom-basic.html
We also reverse the order, so that we don't need iter.rev().
Attachment #8857876 - Flags: review?(emilio+bugs)
This reduces the flag setting overhead on a pessimal from over a second to ~20ms.
Attachment #8857877 - Flags: review?(emilio+bugs)
Comment on attachment 8857876 [details] [diff] [review]
Part 1 - Optimize LRUCache by using a VecDeque. v1

Review of attachment 8857876 [details] [diff] [review]:
-----------------------------------------------------------------

::: servo/components/style/cache.rs
@@ +37,5 @@
>          self.entries.len()
>      }
>  
>      #[inline]
>      /// Touch a given position, and put it in the last item on the list.

Update the comment above this, please :)

::: servo/components/style/context.rs
@@ +8,5 @@
>  use animation::{Animation, PropertyAnimation};
>  use app_units::Au;
>  use bit_vec::BitVec;
>  use bloom::StyleBloom;
> +use cache::LRUCache;

This seems out of place, right?
Attachment #8857876 - Flags: review?(emilio+bugs) → review+
Comment on attachment 8857877 [details] [diff] [review]
Part 2 - Store slow selector flags in a hashmap. v1

Review of attachment 8857877 [details] [diff] [review]:
-----------------------------------------------------------------

The commit message needs updating: "on a pessimal"? I guess you mean "pessimal situation" or something like that?

Anyway, with that and the following nits addressed. r=me

::: servo/components/style/context.rs
@@ +308,5 @@
> +        *f |= flags;
> +
> +        // Insert into the cache. We don't worry about duplicate entries,
> +        // which lets us avoid reshuffling.
> +        self.cache.insert((unsafe { SendElement::new(element)}, *f))

nit: Space between the paren and the brace.

@@ +318,5 @@
> +        for (el, flags) in self.map.drain() {
> +            unsafe { el.set_selector_flags(flags); }
> +        }
> +    }
> +}

Add a `Drop` implementation that debug_asserts that the map is empty? Or alternatively, just drain it on `Drop`?

@@ +400,5 @@
>          debug_assert!(self.current_element_info.is_none());
> +        debug_assert!(thread_state::get() == thread_state::LAYOUT);
> +
> +        // Apply any slow selector flags that need to be set on parents.
> +        self.selector_flags.apply_flags();

Yeah, presumably, just drain it on drop of the SelectorFlagsMap itself.

::: servo/components/style/gecko/wrapper.rs
@@ +701,5 @@
>          self.0 as *const _ == other.0 as *const _
>      }
>  }
>  
> +impl<'le> Eq for GeckoElement<'le> {}

Presumably you also need to do the same in the Servo side, but assuming it's the same, that's fine.
Attachment #8857877 - Flags: review?(emilio+bugs) → review+
(In reply to Emilio Cobos Álvarez [:emilio] from comment #6)
> Comment on attachment 8857877 [details] [diff] [review]
> Part 2 - Store slow selector flags in a hashmap. v1
> 
> Review of attachment 8857877 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> The commit message needs updating: "on a pessimal"? I guess you mean
> "pessimal situation" or something like that?

:-P

> @@ +318,5 @@
> > +        for (el, flags) in self.map.drain() {
> > +            unsafe { el.set_selector_flags(flags); }
> > +        }
> > +    }
> > +}
> 
> Add a `Drop` implementation that debug_asserts that the map is empty? Or
> alternatively, just drain it on `Drop`?

I think there's value in having this logic in the same place as the SequentialTask dispatch logic. I'll add the debug-only drop.
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: