Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 53e6f169995e6029d4a238a424b13cf7ede55ad2
      
https://github.com/WebKit/WebKit/commit/53e6f169995e6029d4a238a424b13cf7ede55ad2
  Author: Yusuke Suzuki <[email protected]>
  Date:   2024-05-15 (Wed, 15 May 2024)

  Changed paths:
    M Source/WebCore/rendering/RenderBlock.cpp
    M Source/WebCore/rendering/RenderBlock.h
    M Source/WebCore/rendering/RenderBlockFlow.cpp
    M Source/WebCore/rendering/RenderBox.cpp
    M Source/WebCore/rendering/RenderBox.h
    M Source/WebCore/rendering/RenderElement.h
    M Source/WebCore/rendering/RenderObject.cpp
    M Source/WebCore/rendering/shapes/ShapeOutsideInfo.h

  Log Message:
  -----------
  Do not query HashMap at RenderObject destruction
https://bugs.webkit.org/show_bug.cgi?id=274192
rdar://128099684

Reviewed by Alan Baradlay.

We found that a lot of HashMap lookups are used in RenderObject and its derived 
classes' destruction.
This makes render tree teardown really costly since HashMap access is not so 
fast.

This patch wipes many of them by using some techniques.

1. We put m_renderBlockHasRareData and m_renderBoxHasShapeOutsideInfo flags to 
indicate whether these
   side data is materialized for this RenderBlock. As a result, we can skip 
querying to HashMap when
   this bit is not set.
2. RenderObject::removeRareData should check HasRareData flag before accessing 
to HashMap.
3. We are already using `HashMap<SingleThreadWeakRef<const T>, U>` much, but 
let's use SingleThreadWeakHashMap
   for that. As a result, for destruction, we do not need to query to this map. 
SingleThreadWeakHashMap will
   sweep dead ones in an amortized manner. This completely removes HashMap 
querying for each destruction.

* Source/WebCore/rendering/RenderBlock.cpp:
(WebCore::PositionedDescendantsMap::addDescendant):
(WebCore::PositionedDescendantsMap::removeDescendant):
(WebCore::PositionedDescendantsMap::removeContainingBlock):
(WebCore::PositionedDescendantsMap::positionedRenderers const):
(WebCore::RenderBlock::~RenderBlock):
(WebCore::RenderBlock::willBeDestroyed):
(WebCore::RenderBlock::getBlockRareData const):
(WebCore::RenderBlock::ensureBlockRareData):
(WebCore::RenderBlock::cachedEnclosingFragmentedFlow const):
(WebCore::RenderBlock::cachedEnclosingFragmentedFlowNeedsUpdate const):
(WebCore::RenderBlock::setCachedEnclosingFragmentedFlowNeedsUpdate):
(WebCore::RenderBlock::updateCachedEnclosingFragmentedFlow const):
(WebCore::RenderBlock::locateEnclosingFragmentedFlow const):
(WebCore::RenderBlock::paginationStrut const):
(WebCore::RenderBlock::pageLogicalOffset const):
(WebCore::RenderBlock::setPaginationStrut):
(WebCore::RenderBlock::setPageLogicalOffset):
(WebCore::RenderBlock::intrinsicBorderForFieldset const):
(WebCore::RenderBlock::setIntrinsicBorderForFieldset):
(WebCore::removeBlockFromPercentageDescendantAndContainerMaps): Deleted.
(WebCore::RenderBlock::blockWillBeDestroyed): Deleted.
(WebCore::RenderBlock::hasRareData const): Deleted.
(WebCore::RenderBlock::removeFromUpdateScrollInfoAfterLayoutTransaction): 
Deleted.
(WebCore::getBlockRareData): Deleted.
(WebCore::ensureBlockRareData): Deleted.
* Source/WebCore/rendering/RenderBlock.h:
* Source/WebCore/rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::willBeDestroyed):
* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::RenderBox::willBeDestroyed):
(WebCore::RenderBox::updateShapeOutsideInfoAfterStyleChange):
(WebCore::RenderBox::overridingLogicalWidth const):
(WebCore::RenderBox::overridingLogicalHeight const):
(WebCore::RenderBox::overridingContainingBlockContentWidth const):
(WebCore::RenderBox::overridingContainingBlockContentHeight const):
(WebCore::RenderBox::overridingContainingBlockContentLogicalWidth const):
(WebCore::RenderBox::overridingContainingBlockContentLogicalHeight const):
(WebCore::RenderBox::overridingLogicalHeightLength const):
(WebCore::RenderBox::overridingLogicalWidthLength const):
(WebCore::RenderBox::imageChanged):
(WebCore::shapeOutsideInfoMap):
(WebCore::RenderBox::shapeOutsideInfo const):
(WebCore::RenderBox::ensureShapeOutsideInfo):
(WebCore::RenderBox::removeShapeOutsideInfo):
* Source/WebCore/rendering/RenderBox.h:
(WebCore::RenderBox::shapeOutsideInfo const): Deleted.
* Source/WebCore/rendering/RenderElement.h:
(WebCore::RenderElement::setRenderBoxHasShapeOutsideInfo):
(WebCore::RenderElement::renderBoxHasShapeOutsideInfo const):
(WebCore::RenderElement::setRenderBlockHasRareData):
(WebCore::RenderElement::renderBlockHasRareData const):
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::removeRareData):
* Source/WebCore/rendering/shapes/ShapeOutsideInfo.h:

Canonical link: https://commits.webkit.org/278829@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to