Big tables can make DocAccessible::ProcessContentInserted() very slow.
Categories
(Core :: Disability Access APIs, defect, P1)
Tracking
()
People
(Reporter: pbone, Assigned: Jamie)
References
(Blocks 1 open bug, Regression)
Details
(Keywords: perf, perf:responsiveness, regression, Whiteboard: [ctw-m4])
Attachments
(2 files)
This is spun off from Bug 1716686
Opening a document with a large table can cause jank that I see as being able to scroll out of the APZ viewport and seeing a blank document and having to wait some seconds for it to get painted.
I tested with https://hg.mozilla.org/mozilla-central/firefoxreleases#bbb448a557b4nightlylinux3220210531170022
Here is a profile with my Firefox Nightly.
https://share.firefox.dev/3EyGmED
Here is a profile with the same installation but I set set accessibility.force_disabled = 1, the profile doesn't show jank.
https://share.firefox.dev/3Er3ViE
I recognise that the profiler is mostly-inaccessible, so I will interpret the profile: the jank is in DocAccessible::ProcessContentInserted(LocalAccessible* aContainer, const nsTArray<nsCOMPtr<nsIContent>>* aNodes);
With some nodes lasting as long as 7 seconds. I can see from the children of this node that the main do-while loop in this function is iterating many many times with most of it's time spent in AfterInsert
and its callees.
Assignee | ||
Comment 1•2 years ago
|
||
If I'm reading the profile right, while this is definitely related to a11y, it probably isn't related to the CTW cache. Would you mind re-testing with accessibility.cache.enabled set to false (requires browser restart)? If I'm right, you'll still see the problem.
There seem to be a lot of insertions happening here, perhaps because the page is large enough that it can't render in one hit. Those insertions cause a lot of a11y mutation events and calculating those events is hurting us badly.
Assignee | ||
Comment 2•2 years ago
|
||
My more naive (albeit simpler) caching strategy for HyperText offsets in the content process in bug 1766794 might have regressed this.
Reporter | ||
Comment 3•2 years ago
|
||
(In reply to James Teh [:Jamie] from comment #1)
If I'm reading the profile right, while this is definitely related to a11y, it probably isn't related to the CTW cache. Would you mind re-testing with accessibility.cache.enabled set to false (requires browser restart)? If I'm right, you'll still see the problem.
There seem to be a lot of insertions happening here, perhaps because the page is large enough that it can't render in one hit. Those insertions cause a lot of a11y mutation events and calculating those events is hurting us badly.
I have restarted with CTW disabled and the problem still reproduces, it looked different because it wouldn't scroll at all, but in the profile https://share.firefox.dev/3gqG36Y it's in the same place.
Reporter | ||
Updated•2 years ago
|
Assignee | ||
Comment 4•2 years ago
|
||
It probably looks different because the parent process blocks waiting for content with the cache disabled, whereas it doesn't do that with the cache enabled. But ultimately, the root cause isn't the cache.
Thanks for filing and testing. I have at least one hypothesis here (see comment 2), so I'll dig into that when I get a chance.
Assignee | ||
Comment 5•2 years ago
|
||
A build before bug 1766794 does seem to be better, though it's hard to be entirely certain because it's still a bit janky (but I can't seem to see any reason for that jankiness in the profiler). Bug 1766794 definitely seems to have regressed this to some extent at least, so even if it isn't the complete cause, I'm going to deal with that regression first.
Comment 6•2 years ago
|
||
Set release status flags based on info from the regressing bug 1766794
Updated•2 years ago
|
Assignee | ||
Comment 7•2 years ago
|
||
We will soon have an offsets array in the parent process cache which is not built in one shot.
Instead, we will gradually cache more offsets as they are requested.
To do this, we need a way to get an array from the cache which can be modified in-place.
Assignee | ||
Comment 8•2 years ago
|
||
In bug 1766794, I replaced partial invalidation of cached offsets with full cache invalidation.
I did this to simplify the code, since the offsets cache was being extended to RemoteAccessible.
This is fine for RemoteAccessible because offsets are only needed there when clients query them.
However, for local HyperTextAccessible, offsets are always required to fire text events.
Full cache invalidation there meant that many insertions into a large container was very expensive.
To fix this, reinstate the ability to partially invalidate the offsets cache.
This is largely the code I previously removed from HyperTextAccessible, with some tweaks for readability.
Assignee | ||
Updated•2 years ago
|
Comment 10•2 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/80097f40fc50
https://hg.mozilla.org/mozilla-central/rev/e488a2686d0b
Comment 11•2 years ago
|
||
== Change summary for alert #36361 (as of Thu, 08 Dec 2022 19:00:02 GMT) ==
Improvements:
Ratio | Test | Platform | Options | Absolute values (old vs new) |
---|---|---|---|---|
31% | a11yr dhtml.html | macosx1015-64-shippable-qr | e10s fission stylo webrender-sw | 946.25 -> 651.99 |
30% | a11yr dhtml.html | macosx1015-64-shippable-qr | e10s fission stylo webrender-sw | 950.04 -> 666.51 |
29% | a11yr dhtml.html | macosx1015-64-shippable-qr | e10s fission stylo webrender | 941.14 -> 667.76 |
24% | a11yr dhtml.html | linux1804-64-shippable-qr | e10s fission stylo webrender-sw | 1,059.01 -> 802.65 |
23% | a11yr dhtml.html | linux1804-64-shippable-qr | e10s fission stylo webrender | 1,058.59 -> 813.22 |
... | ... | ... | ... | ... |
19% | a11yr dhtml.html | windows10-64-shippable-qr | e10s fission stylo webrender-sw | 1,198.96 -> 966.44 |
For up to date results, see: https://treeherder.mozilla.org/perfherder/alerts?id=36361
Description
•