[webkit-changes] [WebKit/WebKit] 53e6f1: Do not query HashMap at RenderObject destruction

Yusuke Suzuki noreply at github.com
Wed May 15 15:30:51 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 53e6f169995e6029d4a238a424b13cf7ede55ad2
      https://github.com/WebKit/WebKit/commit/53e6f169995e6029d4a238a424b13cf7ede55ad2
  Author: Yusuke Suzuki <ysuzuki at apple.com>
  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


More information about the webkit-changes mailing list