MatchedPropertiesCacheItem wastes 388KB of vector capacity on nytimes.com
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Jun 2018 21:15:21 +0000 (21:15 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 25 Jun 2018 21:15:21 +0000 (21:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=186990

Reviewed by Antti Koivisto.

MatchedPropertiesCacheItem.matchedProperties was appended to, so it allocated capacity
in 16-size chunks. Instead, assign to it so it only allocates as much capacity as is needed.
Copy-constructing is more wasteful, since it copies the 64-chunk size from the right-hand side.

* css/StyleResolver.cpp:
(WebCore::StyleResolver::addToMatchedPropertiesCache):
* css/StyleResolver.h:
(WebCore::StyleResolver::MatchedPropertiesCacheItem::MatchedPropertiesCacheItem):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@233173 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/css/StyleResolver.cpp
Source/WebCore/css/StyleResolver.h

index f41c8da..21f283e 100644 (file)
@@ -1,3 +1,19 @@
+2018-06-25  Simon Fraser  <simon.fraser@apple.com>
+
+        MatchedPropertiesCacheItem wastes 388KB of vector capacity on nytimes.com
+        https://bugs.webkit.org/show_bug.cgi?id=186990
+
+        Reviewed by Antti Koivisto.
+
+        MatchedPropertiesCacheItem.matchedProperties was appended to, so it allocated capacity
+        in 16-size chunks. Instead, assign to it so it only allocates as much capacity as is needed.
+        Copy-constructing is more wasteful, since it copies the 64-chunk size from the right-hand side.
+
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::addToMatchedPropertiesCache):
+        * css/StyleResolver.h:
+        (WebCore::StyleResolver::MatchedPropertiesCacheItem::MatchedPropertiesCacheItem):
+
 2018-06-25  Chris Dumez  <cdumez@apple.com>
 
         Null dereference crash un ApplicationCacheGroup::startLoadingEntry()
index ad59fac..4da5092 100644 (file)
@@ -1251,13 +1251,9 @@ void StyleResolver::addToMatchedPropertiesCache(const RenderStyle* style, const
     }
 
     ASSERT(hash);
-    MatchedPropertiesCacheItem cacheItem;
-    cacheItem.matchedProperties.appendVector(matchResult.matchedProperties());
-    cacheItem.ranges = matchResult.ranges;
     // Note that we don't cache the original RenderStyle instance. It may be further modified.
     // The RenderStyle in the cache is really just a holder for the substructures and never used as-is.
-    cacheItem.renderStyle = RenderStyle::clonePtr(*style);
-    cacheItem.parentRenderStyle = RenderStyle::clonePtr(*parentStyle);
+    MatchedPropertiesCacheItem cacheItem(matchResult, style, parentStyle);
     m_matchedPropertiesCache.add(hash, WTFMove(cacheItem));
 }
 
index 0f2f3fe..0e83c0e 100644 (file)
@@ -468,6 +468,16 @@ private:
         MatchRanges ranges;
         std::unique_ptr<RenderStyle> renderStyle;
         std::unique_ptr<RenderStyle> parentRenderStyle;
+        
+        MatchedPropertiesCacheItem(const MatchResult& matchResult, const RenderStyle* style, const RenderStyle* parentStyle)
+            : ranges(matchResult.ranges)
+            , renderStyle(RenderStyle::clonePtr(*style))
+            , parentRenderStyle(RenderStyle::clonePtr(*parentStyle))
+        {
+            // Assign rather than copy-construct so we only allocate as much vector capacity as needed.
+            matchedProperties = matchResult.matchedProperties();
+        }
+        MatchedPropertiesCacheItem() = default;
     };
     const MatchedPropertiesCacheItem* findFromMatchedPropertiesCache(unsigned hash, const MatchResult&);
     void addToMatchedPropertiesCache(const RenderStyle*, const RenderStyle* parentStyle, unsigned hash, const MatchResult&);