diff options
author | Gaming4JC <g4jc@hyperbola.info> | 2020-01-04 10:34:36 -0500 |
---|---|---|
committer | Gaming4JC <g4jc@hyperbola.info> | 2020-01-26 15:50:15 -0500 |
commit | d8109fa9a0aae6ee09eca1d6b5cfab285af318f9 (patch) | |
tree | 0fa205b178976873c535ca2763dba3c9ba932bf3 /dom | |
parent | e0557470385b6f7c1ab8e277b2b72a5146856fe6 (diff) | |
download | UXP-d8109fa9a0aae6ee09eca1d6b5cfab285af318f9.tar UXP-d8109fa9a0aae6ee09eca1d6b5cfab285af318f9.tar.gz UXP-d8109fa9a0aae6ee09eca1d6b5cfab285af318f9.tar.lz UXP-d8109fa9a0aae6ee09eca1d6b5cfab285af318f9.tar.xz UXP-d8109fa9a0aae6ee09eca1d6b5cfab285af318f9.zip |
Bug 1309147 - Part 5: Eliminate performance cliff when accessing CEReactions code.
Tag UXP Issue #1344
Diffstat (limited to 'dom')
-rw-r--r-- | dom/base/CustomElementRegistry.cpp | 11 | ||||
-rw-r--r-- | dom/base/CustomElementRegistry.h | 13 |
2 files changed, 19 insertions, 5 deletions
diff --git a/dom/base/CustomElementRegistry.cpp b/dom/base/CustomElementRegistry.cpp index b50a1345e..c3d25465e 100644 --- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -905,7 +905,11 @@ CustomElementReactionsStack::PopAndInvokeElementQueue() "Reaction stack shouldn't be empty"); ElementQueue& elementQueue = mReactionsStack.LastElement(); - InvokeReactions(elementQueue); + // Check element queue size in order to reduce function call overhead. + if (!elementQueue.IsEmpty()) { + InvokeReactions(elementQueue); + } + DebugOnly<bool> isRemovedElement = mReactionsStack.RemoveElement(elementQueue); MOZ_ASSERT(isRemovedElement, "Reaction stack should have an element queue to remove"); @@ -954,7 +958,10 @@ CustomElementReactionsStack::Enqueue(Element* aElement, void CustomElementReactionsStack::InvokeBackupQueue() { - InvokeReactions(mBackupQueue); + // Check backup queue size in order to reduce function call overhead. + if (!mBackupQueue.IsEmpty()) { + InvokeReactions(mBackupQueue); + } } void diff --git a/dom/base/CustomElementRegistry.h b/dom/base/CustomElementRegistry.h index 5fc2eb2fd..24d501d73 100644 --- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -179,7 +179,8 @@ public: // nsWeakPtr is a weak pointer of Element // The element reaction queues are stored in ElementReactionQueueMap. // We need to lookup ElementReactionQueueMap again to get relevant reaction queue. - typedef nsTArray<nsWeakPtr> ElementQueue; + // The choice of 1 for the auto size here is based on gut feeling. + typedef AutoTArray<nsWeakPtr, 1> ElementQueue; /** * Enqueue a custom element upgrade reaction @@ -201,13 +202,19 @@ public: private: ~CustomElementReactionsStack() {}; - typedef nsTArray<nsAutoPtr<CustomElementReaction>> ReactionQueue; + // There is 1 reaction in reaction queue, when 1) it becomes disconnected, + // 2) it’s adopted into a new document, 3) its attributes are changed, + // appended, removed, or replaced. + // There are 3 reactions in reaction queue when doing upgrade operation, + // e.g., create an element, insert a node. + typedef AutoTArray<nsAutoPtr<CustomElementReaction>, 3> ReactionQueue; typedef nsClassHashtable<nsISupportsHashKey, ReactionQueue> ElementReactionQueueMap; ElementReactionQueueMap mElementReactionQueueMap; - nsTArray<ElementQueue> mReactionsStack; + // The choice of 8 for the auto size here is based on gut feeling. + AutoTArray<ElementQueue, 8> mReactionsStack; ElementQueue mBackupQueue; // https://html.spec.whatwg.org/#enqueue-an-element-on-the-appropriate-element-queue bool mIsBackupQueueProcessing; |