Skip to content

Commit 383dca8

Browse files
Minor improvements to the recalc explainer
1 parent 38da138 commit 383dca8

File tree

2 files changed

+37
-33
lines changed

2 files changed

+37
-33
lines changed
1.87 KB
Loading

explainers/StyleTracing/explainer.md

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,79 @@
11
# DevTools: Selector Performance Tracing for Style Calculations
22

33
Authors:
4-
- *[Brandon Walderman](https://github.com/bwalderman)*, Senior Software Engineer, Microsoft Edge
4+
5+
* *[Brandon Walderman](https://github.com/bwalderman)*, Senior Software Engineer, Microsoft Edge.
6+
7+
## Feedback
8+
9+
Have feedback about this explainer? We want to hear it!
10+
11+
**[Issue #98](https://github.com/MicrosoftEdge/DevTools/issues/98)** tracks community feedback on this explainer.
512

613
## Status of this feature
714

815
This is a proposal for a new feature that is not yet in development.
916

1017
## Introduction
1118

12-
Style recalculation is the process of iterating through DOM elements on a page, finding all of the CSS style rules that match a given element and then computing the element's actual style based on these rules.
19+
Style recalculation (or style recalc) is the process of iterating through DOM elements on a page, finding all of the CSS style rules that match a given element and then computing the element's actual style based on these rules.\
1320
Style recalc needs to happen whenever the applicability of CSS rules may have changed. Some examples include:
1421

15-
- Elements were inserted or removed from the DOM
16-
- An element's attributes (e.g. class, id) were changed
17-
- User input such as mouse move or focus change, which can affect `:hover` rules
22+
* Elements were inserted or removed from the DOM
23+
* An element's attributes (e.g. class, id) were changed
24+
* User input such as mouse move or focus change, which can affect `:hover` rules
1825

19-
Style recalc can be an expensive operation and long-running style or layout operations can become performance bottlenecks that web developers need to debug.
26+
Style recalc can be an expensive operation and long-running recalc operations can become performance bottlenecks that web developers need to debug.
2027

2128
The DevTools performance panel records a "Recalculate Style" trace event that shows when style recalculation occurs.
2229

2330
![A DevTools performance trace with a Recalculate Style event](current-recalc-style-trace.png)
2431

25-
The event currently shows the elapsed time and total number of elements affected, but no information about which elements these are, or which style rules were involved.
26-
Although the JavaScript location that triggered the style recalc is sometimes included in the trace event, it may not always be obvious how the initiator is related to the affected elements, especially when there are a large number of them.
32+
The event currently shows the elapsed time and total number of elements affected, but no information about which elements these are, or which style rules were involved.\
33+
Although the JavaScript location that triggered the style recalc is sometimes included in the trace event, it may not always be obvious how the initiator is related to the affected elements, especially when there are a large number of them.\
2734
Overall, this can make it difficult for web developers to understand how to fix long-running style recalc tasks with the information at hand.
2835

2936
We'd like to offer web developers greater visibility into how time is being spent during style recalc to make it easier to root cause and mitigate performance issues due to recalc.
3037

3138
## Existing Solutions
3239

33-
Developers can already see extra statistics from style recalc in the `edge://tracing` UI if the `"blink.debug"` tracing tag is enabled.
40+
Developers can already see extra statistics from style recalc in the `edge://tracing` UI if the `"blink.debug"` tracing tag is enabled.\
3441
The statistics show up as a `SelectorStats` trace event which includes a table of style rules with the following columns:
3542

36-
- Elapsed CPU time spent evaluating the style rule (lower is better)
37-
- Number of "fast reject" elements that were cheap/efficient to eliminate from matching (higher portion of attempts is better)
38-
- Number of elements the Blink rendering engine attempted to match with the rule
39-
- Number of elements that were actually matched
40-
- CSS selector text
43+
* Elapsed CPU time spent evaluating the style rule (lower is better).
44+
* Number of "fast reject" elements that were cheap/efficient to eliminate from matching (higher portion of attempts is better).
45+
* Number of elements the Blink rendering engine attempted to match with the rule.
46+
* Number of elements that were actually matched.
47+
* CSS selector text.
4148

4249
![SelectorStats event viewed through edge://tracing](selector-stats.png)
4350

51+
This information can be valuable to web developers, but the `edge://tracing` UI can be daunting, especially for beginners, and the `"blink.debug"` tag needs to be enabled first.
52+
4453
## Proposed Solution
4554

46-
This information can be valuable to web developers, but the `edge://tracing` UI can be daunting, especially for beginners.
47-
The proposed solution is to display these same statistics in the details view for "Recalcuate Style" events in DevTools performance traces, where it will be more visible to web developers who are already familiar with the DevTools performance panel.
55+
The proposed solution is to display these same statistics in the details view for "Recalculate Style" events in DevTools performance traces, where it will be more visible to web developers who are already familiar with the DevTools Performance tool.
4856

49-
Developers will be able to sort the table by any column, so that they can identify individual rules that take a longer time to process or have a high number of match attempts.
57+
Developers will be able to sort the table by any column, so that they can identify individual rules that take a longer time to process or have a high number of match attempts.\
5058
If available, the CSS selector text will be enhanced with a link to the source location where the CSS rule is declared. This will let web developers quickly jump to the rule they are interested in so they can continue their investigation.
5159

52-
Below is a mockup of the proposed design, with the new content highlighted in red. Note that links to source locations are not currently shown in this mockup but would be rendered similar to other source links found in DevTools.
60+
Below is a mockup of the proposed design, with the new content highlighted in red. Note that links to source locations are not currently shown in this mockup but would be rendered similar to other source links found in DevTools.
5361

54-
![The Recalculate Styles trace event details view with new selector statistics included](prototype-recalc-style-trace.png)
62+
![A DevTools mockup of the Recalculate Styles trace event details view with new selector statistics included](prototype-recalc-style-trace.png)
5563

5664
## Usage
5765

58-
Selector statistics in DevTools performance traces will be disabled by default because the underlying `SelectorStats` trace event is expensive to record and can have a noticeable impact on page perf.
59-
While enabling this feature would impact raw timings captured throughout the trace, the timings would still be proportional to each other and can still yield useful information to developers.
66+
Selector statistics in DevTools performance traces will be disabled by default because the underlying `SelectorStats` trace event is expensive to record and can have a noticeable impact on page perf.\
67+
While enabling this feature would impact raw timings captured throughout the trace, the timings would still be proportional to each other and can still yield useful information to developers.\
6068
Developers will need to explicitly enable the feature through a checkbox in the performance panel settings.
6169

62-
The DevTools performance panel already has a similar optional feature named "advanced paint instrumentation".
63-
The checkbox to enable the feature includes a warning about the performance overhead, both in the label and in the tooltip.
70+
The DevTools performance panel already has a similar optional feature named "advanced paint instrumentation".\
71+
The checkbox to enable the feature includes a warning about the performance overhead, both in the label and in the tooltip.\
6472
The settings icon color is also changed to red to remind the user, even while the settings are hidden.
6573

6674
![DevTools performance panel settings with advanced paint instrumentation enabled](advanced-paint.png)
6775

68-
Instead of adding another checkbox to the settings view, we should consider merging the selector statistics and advanced paint instrumentation into a single checkbox named "enable advanced rendering instrumentation (slow)".
76+
Instead of adding another checkbox to the settings view, we should consider merging the selector statistics and advanced paint instrumentation into a single checkbox named "enable advanced rendering instrumentation (slow)".\
6977
This avoids the need for another checkbox in the settings view and allows us to re-use the existing UI for warning about the performance impact.
7078

7179
When the checkbox is enabled, a table of selector statistics will be available in the details view for any "Recalculate Styles" events.
@@ -74,15 +82,11 @@ When the checkbox is enabled, a table of selector statistics will be available i
7482

7583
We should provide web developers with resources to understand how to use this new tool effectively. Some patterns in the data worth exploring:
7684

77-
- Expensive unused selectors
78-
- Expensive broadly scoped selectors
79-
- Underutilized selectors (low match count / match attempts)
80-
81-
## Feedback
82-
83-
Have feedback? We want to hear it! *[Issue #98](https://github.com/MicrosoftEdge/DevTools/issues/98)* tracks community feedback on this explainer.
85+
* Expensive unused selectors.
86+
* Expensive broadly scoped selectors.
87+
* Underutilized selectors (low match count / match attempts).
8488

8589
## References
8690

87-
1. https://web.dev/reduce-the-scope-and-complexity-of-style-calculations
88-
1. https://chromium-review.googlesource.com/c/chromium/src/+/3582806
91+
* Blog post: [Reduce the scope and complexity of style calculations](https://web.dev/reduce-the-scope-and-complexity-of-style-calculations)
92+
* Chromium commit: [Collect statistics on selector matching during style recalc](https://chromium-review.googlesource.com/c/chromium/src/+/3582806)

0 commit comments

Comments
 (0)