Bug 1457030: Remove elements from the mNodesToDestroy array back to front, preventing expensive memmoves on large amounts of reuse. r=kats
MozReview-Commit-ID: DZ1H9KIuDUp
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -726,20 +726,20 @@ GetEventRegions(const ScrollNode& aLayer
already_AddRefed<HitTestingTreeNode>
APZCTreeManager::RecycleOrCreateNode(TreeBuildingState& aState,
AsyncPanZoomController* aApzc,
LayersId aLayersId)
{
// Find a node without an APZC and return it. Note that unless the layer tree
// actually changes, this loop should generally do an early-return on the
// first iteration, so it should be cheap in the common case.
- for (size_t i = 0; i < aState.mNodesToDestroy.Length(); i++) {
+ for (int32_t i = aState.mNodesToDestroy.Length() - 1; i >= 0; i--) {
RefPtr<HitTestingTreeNode> node = aState.mNodesToDestroy[i];
if (!node->IsPrimaryHolder()) {
- aState.mNodesToDestroy.RemoveElement(node);
+ aState.mNodesToDestroy.RemoveElementAt(i);
node->RecycleWith(aApzc, aLayersId);
return node.forget();
}
}
RefPtr<HitTestingTreeNode> node = new HitTestingTreeNode(aApzc, false, aLayersId);
return node.forget();
}