Closed Bug 1396575 Opened 8 years ago Closed 7 years ago

Track performance for creating an autonomous custom elements which doesn't match CE definition

Categories

(Core :: DOM: Core & HTML, enhancement, P2)

enhancement

Tracking

()

RESOLVED FIXED

People

(Reporter: jdai, Unassigned)

References

Details

Attachments

(1 file)

+++ This bug was initially created as a follow-up of bug 1299363 comment #77 +++ * The nearly-normal case (createElement, with the changes, define() call, one arg), is also much slower than what we have now. Needs to be profiled, understood, and fixed: the one-arg case should have no performance penalty, I would think. Performance detail result: https://docs.google.com/a/mozilla.com/spreadsheets/d/1OLntq8Qd4e4td7ml6iq0r1sVxl4phMta3HFAAMvpAms/edit?usp=sharing
Priority: -- → P2
This bug is for nearly-normal case (createElement, with the changes, define() call, one arg) that is we defined a custom element, but createElement doesn't use that defined custom element to create. Ex: class FooElement extends HTMLDivElement { constructor() { super(); } }; customElements.define("x-foo", FooElement, { extends: "div" }); document.createElement("div"); And the bug title will be moved to bug 1419661.
Summary: CreateElement with define() call and it'll run upgrade which is much slower than what we have now → When custom elements preference is on, createElement with define() call, one arg is also much slower than what we have now
(In reply to John Dai[:jdai] from comment #1) > This bug is for nearly-normal case (createElement, with the changes, > define() call, one arg) that is we defined a custom element, but > createElement doesn't use that defined custom element to create. Ex: > > class FooElement extends HTMLDivElement { > constructor() { > super(); > } > }; > customElements.define("x-foo", FooElement, { extends: "div" }); > > document.createElement("div"); This creates a normal element and this case is already tracked in bug 1396573. I guess this bug is filed for "creating a custom element which doesn't match with any existing definition". So perhaps, the test should be "document.createElement("x-foo");" ?
Flags: needinfo?(jdai)
(In reply to Edgar Chen [:edgar] from comment #2) > (In reply to John Dai[:jdai] from comment #1) > > This bug is for nearly-normal case (createElement, with the changes, > > define() call, one arg) that is we defined a custom element, but > > createElement doesn't use that defined custom element to create. Ex: > > > > class FooElement extends HTMLDivElement { > > constructor() { > > super(); > > } > > }; > > customElements.define("x-foo", FooElement, { extends: "div" }); > > > > document.createElement("div"); > > This creates a normal element and this case is already tracked in bug > 1396573. > I guess this bug is filed for "creating a custom element which doesn't match > with any existing definition". > So perhaps, the test should be "document.createElement("x-foo");" ? Maybe we can consider this bug is for creating an autonomous custom element or a customized built-in element which doesn't match with any existing definition. Does that make sense?
Flags: needinfo?(jdai)
(In reply to John Dai[:jdai] from comment #3) > Maybe we can consider this bug is for creating an autonomous custom element > or a customized built-in element which doesn't match with any existing > definition. Does that make sense? I thought bug 1419660 is filed for creating a customized built-in element which doesn't match with any existing definition?
Flags: needinfo?(jdai)
(In reply to Edgar Chen [:edgar] from comment #4) > (In reply to John Dai[:jdai] from comment #3) > > Maybe we can consider this bug is for creating an autonomous custom element > > or a customized built-in element which doesn't match with any existing > > definition. Does that make sense? > > I thought bug 1419660 is filed for creating a customized built-in element > which doesn't match with any existing definition? Bug 1419660 is for creating a customized built-in element with no define() calls(testcase [1]). We can separate creating a customized built-in element which doesn't match with any existing definition to another bug if it'll make this bug more clear. [1] https://edgarchen.github.io/tests/CustomElements/Performance/CreateElement/Builtin/no_definition_two_arg_with_is.html
Flags: needinfo?(jdai)
Per off-line discussion, this bug is for creating an autonomous custom elements which doesn't match CE definition. We can consider CE preference is on/off case for document.createElement("x-foo").
Summary: When custom elements preference is on, createElement with define() call, one arg is also much slower than what we have now → Track performance for creating an autonomous custom elements which doesn't match CE definition
Attached file test.html
Quick test attachment #894177 on recent m-c, 05fed903f40f pref-off: ~33ms pref-on: ~54ms In pref-on case, definition lookup is one possible operation that makes the createElement() slower. But I am not sure if there are others, need to do more investigation.
Test: attachment #8941774 [details] with pref-on Base revision: 6f9b763bb1c9 Profile: https://perfht.ml/2DfQqWg
From profile [1] in comment #9, I found we spend some time atomizing aLocalName when looking up definition [2]. And the caller usually pass nodeInfo->LocalName() as aLocalName, like [3]. I wondering if we could use nodeInfo->NameAtom() given that these code is only called with element's nodeInfo which the LocalName() and NameAtom() should be the same value. Does this make sense? [1] https://perf-html.io/public/708b78ee5c83e942269ea6b20795464b61337624/calltree/?hiddenThreads=&invertCallstack&range=2.6524_2.7236&thread=5&threadOrder=0-2-3-4-5-1&transforms=f-combined-xAi-i&v=2 [2] https://searchfox.org/mozilla-central/rev/41925c0b6c6d58578690121de439d2a8d3d690f3/dom/base/CustomElementRegistry.cpp#290 [3] https://searchfox.org/mozilla-central/rev/41925c0b6c6d58578690121de439d2a8d3d690f3/dom/base/nsContentUtils.cpp#10012
Flags: needinfo?(bugs)
(In reply to Olli Pettay [:smaug] (please try to find other reviewers for non-web components patches) from comment #11) > Sounds reasonable given that we're dealing with elements > https://searchfox.org/mozilla-central/rev/ > 48cbb200aa027a0a379b6004b6196a167344b865/dom/base/NodeInfo.cpp#79,89 Filed bug 1430951. Thank you!
Depends on: 1430951
Another found: we spend some time AddRef()ing and Release()ing of atoms in nsContentUtils::NewXULOrHTMLElement [1], some is from https://searchfox.org/mozilla-central/rev/48cbb200aa027a0a379b6004b6196a167344b865/dom/base/nsContentUtils.cpp#9994. It seems we could just use raw pointer there given that the atom is owned by nodeInfo, but I am not not sure how much this could improve. [1] https://perf-html.io/public/708b78ee5c83e942269ea6b20795464b61337624/calltree/?hiddenThreads=&invertCallstack&range=4.8478_4.9187&thread=5&threadOrder=0-2-3-4-5-1&v=2
We've fixed the obvious cases. One thing which would help is faster slots allocation. Testcase is faster in Gecko than in Blink. Marking fixed for now.
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: