Modified: trunk/Source/WebCore/ChangeLog (275632 => 275633)
--- trunk/Source/WebCore/ChangeLog 2021-04-07 22:17:52 UTC (rev 275632)
+++ trunk/Source/WebCore/ChangeLog 2021-04-07 22:17:55 UTC (rev 275633)
@@ -1,5 +1,27 @@
2021-04-07 Simon Fraser <[email protected]>
+ Reduce Vector<> wasted capacity in some RuleSet code
+ https://bugs.webkit.org/show_bug.cgi?id=224160
+
+ Reviewed by Antti Koivisto.
+
+ Dynamic media rule-related vectors were not getting shrunk because m_dynamicMediaQueryRules
+ was constructed after the shrinkToFit() calls, and itself was not shrunk.
+
+ Also re-order member variables to reduce padding.
+
+ Saves 60-120KB on a nytimes page.
+
+ * style/RuleSet.cpp:
+ (WebCore::Style::RuleSet::addRulesFromSheet):
+ (WebCore::Style::RuleSet::evaluateDynamicMediaQueryRules):
+ (WebCore::Style::shrinkDynamicRules):
+ (WebCore::Style::RuleSet::shrinkToFit):
+ * style/RuleSet.h:
+ (WebCore::Style::RuleSet::DynamicMediaQueryRules::shrinkToFit):
+
+2021-04-07 Simon Fraser <[email protected]>
+
Wasted vector capacity in RenderLayer lists
https://bugs.webkit.org/show_bug.cgi?id=224170
Modified: trunk/Source/WebCore/style/RuleSet.cpp (275632 => 275633)
--- trunk/Source/WebCore/style/RuleSet.cpp 2021-04-07 22:17:52 UTC (rev 275632)
+++ trunk/Source/WebCore/style/RuleSet.cpp 2021-04-07 22:17:55 UTC (rev 275633)
@@ -313,6 +313,9 @@
{
auto mediaQueryCollector = MediaQueryCollector { evaluator };
addRulesFromSheet(sheet, mediaQueryCollector, nullptr, AddRulesMode::Normal);
+
+ if (m_autoShrinkToFitEnabled)
+ shrinkToFit();
}
void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQuerySet* sheetQuery, const MediaQueryEvaluator& evaluator, Style::Resolver& resolver)
@@ -333,14 +336,16 @@
m_hasViewportDependentMediaQueries = mediaQueryCollector.hasViewportDependentMediaQueries;
- if (mediaQueryCollector.dynamicMediaQueryRules.isEmpty())
- return;
+ if (!mediaQueryCollector.dynamicMediaQueryRules.isEmpty()) {
+ auto firstNewIndex = m_dynamicMediaQueryRules.size();
+ m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
- auto firstNewIndex = m_dynamicMediaQueryRules.size();
- m_dynamicMediaQueryRules.appendVector(WTFMove(mediaQueryCollector.dynamicMediaQueryRules));
+ // Set the initial values.
+ evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+ }
- // Set the initial values.
- evaluateDynamicMediaQueryRules(evaluator, firstNewIndex);
+ if (m_autoShrinkToFitEnabled)
+ shrinkToFit();
}
void RuleSet::addRulesFromSheet(StyleSheetContents& sheet, MediaQueryCollector& mediaQueryCollector, Resolver* resolver, AddRulesMode mode)
@@ -355,9 +360,6 @@
}
addChildRules(sheet.childRules(), mediaQueryCollector, resolver, mode);
-
- if (m_autoShrinkToFitEnabled && mode == AddRulesMode::Normal)
- shrinkToFit();
}
void RuleSet::addStyleRule(const StyleRule& rule, MediaQueryCollector& mediaQueryCollector)
@@ -415,6 +417,7 @@
for (auto& feature : *featureVector)
ruleSet->addRule(*feature.styleRule, feature.selectorIndex, feature.selectorListIndex);
}
+ ruleSet->shrinkToFit();
return ruleSet;
}).iterator->value;
@@ -483,6 +486,14 @@
vector->shrinkToFit();
}
+static inline void shrinkDynamicRules(Vector<RuleSet::DynamicMediaQueryRules>& dynamicRules)
+{
+ for (auto& rule : dynamicRules)
+ rule.shrinkToFit();
+
+ dynamicRules.shrinkToFit();
+}
+
void RuleSet::shrinkToFit()
{
shrinkMapVectorsToFit(m_idRules);
@@ -490,6 +501,7 @@
shrinkMapVectorsToFit(m_tagLocalNameRules);
shrinkMapVectorsToFit(m_tagLowercaseLocalNameRules);
shrinkMapVectorsToFit(m_shadowPseudoElementRules);
+
m_linkPseudoClassRules.shrinkToFit();
#if ENABLE(VIDEO)
m_cuePseudoRules.shrinkToFit();
@@ -496,10 +508,14 @@
#endif
m_hostPseudoClassRules.shrinkToFit();
m_slottedPseudoElementRules.shrinkToFit();
+ m_partPseudoElementRules.shrinkToFit();
m_focusPseudoClassRules.shrinkToFit();
m_universalRules.shrinkToFit();
+
m_pageRules.shrinkToFit();
m_features.shrinkToFit();
+
+ shrinkDynamicRules(m_dynamicMediaQueryRules);
}
RuleSet::MediaQueryCollector::~MediaQueryCollector() = default;
Modified: trunk/Source/WebCore/style/RuleSet.h (275632 => 275633)
--- trunk/Source/WebCore/style/RuleSet.h 2021-04-07 22:17:52 UTC (rev 275632)
+++ trunk/Source/WebCore/style/RuleSet.h 2021-04-07 22:17:55 UTC (rev 275633)
@@ -76,6 +76,13 @@
Vector<RuleFeature> ruleFeatures;
bool requiresFullReset { false };
bool result { true };
+
+ void shrinkToFit()
+ {
+ mediaQuerySets.shrinkToFit();
+ affectedRulePositions.shrinkToFit();
+ ruleFeatures.shrinkToFit();
+ }
};
struct MediaQueryCollector {
@@ -153,7 +160,6 @@
template<typename Function> void traverseRuleDatas(Function&&);
-
AtomRuleMap m_idRules;
AtomRuleMap m_classRules;
AtomRuleMap m_tagLocalNameRules;
@@ -169,13 +175,13 @@
RuleDataVector m_focusPseudoClassRules;
RuleDataVector m_universalRules;
Vector<StyleRulePage*> m_pageRules;
+ RuleFeatureSet m_features;
+ Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
+ HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
unsigned m_ruleCount { 0 };
bool m_hasHostPseudoClassRulesMatchingInShadowTree { false };
bool m_autoShrinkToFitEnabled { true };
- RuleFeatureSet m_features;
bool m_hasViewportDependentMediaQueries { false };
- Vector<DynamicMediaQueryRules> m_dynamicMediaQueryRules;
- HashMap<Vector<size_t>, Ref<const RuleSet>> m_mediaQueryInvalidationRuleSetCache;
};
inline const RuleSet::RuleDataVector* RuleSet::tagRules(const AtomString& key, bool isHTMLName) const