[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