Bug 1309147 - Part 5: Eliminate performance cliff when accessing CEReactions code.

Tag UXP Issue #1344
This commit is contained in:
Gaming4JC 2020-01-04 10:34:36 -05:00 committed by Roy Tam
commit f7154d573b
2 changed files with 19 additions and 5 deletions

View file

@ -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

View file

@ -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) its 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;