Title: [211068] trunk/Source/WebKit2
Revision
211068
Author
[email protected]
Date
2017-01-23 15:37:42 -0800 (Mon, 23 Jan 2017)

Log Message

Maintain ordering when doing speculative loads
https://bugs.webkit.org/show_bug.cgi?id=167324

Reviewed by Chris Dumez.

We currently randomize the ordering of speculative loads because they are serialized as a hash map.
It would be better to load in the same order as the requests were originally issued as that is
likely to match the order the document needs them.

* NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
(WebKit::NetworkCache::SpeculativeLoadManager::startSpeculativeRevalidation):
* NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp:
(WebKit::NetworkCache::SubresourceInfo::encode):
(WebKit::NetworkCache::SubresourceInfo::decode):

    Include key into SubresourceInfo.

(WebKit::NetworkCache::makeSubresourcesVector):

    Deduplicate the entries.

(WebKit::NetworkCache::SubresourcesEntry::SubresourcesEntry):
(WebKit::NetworkCache::SubresourcesEntry::updateSubresourceLoads):
* NetworkProcess/cache/NetworkCacheSubresourcesEntry.h:
(WebKit::NetworkCache::SubresourceInfo::SubresourceInfo):
(WebKit::NetworkCache::SubresourceInfo::key):
(WebKit::NetworkCache::SubresourceInfo::setTransient):
(WebKit::NetworkCache::SubresourcesEntry::subresources):

    Keep the resources in a Vector instead of a HashMap to maintain order.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (211067 => 211068)


--- trunk/Source/WebKit2/ChangeLog	2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/ChangeLog	2017-01-23 23:37:42 UTC (rev 211068)
@@ -1,3 +1,36 @@
+2017-01-23  Antti Koivisto  <[email protected]>
+
+        Maintain ordering when doing speculative loads
+        https://bugs.webkit.org/show_bug.cgi?id=167324
+
+        Reviewed by Chris Dumez.
+
+        We currently randomize the ordering of speculative loads because they are serialized as a hash map.
+        It would be better to load in the same order as the requests were originally issued as that is
+        likely to match the order the document needs them.
+
+        * NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp:
+        (WebKit::NetworkCache::SpeculativeLoadManager::startSpeculativeRevalidation):
+        * NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp:
+        (WebKit::NetworkCache::SubresourceInfo::encode):
+        (WebKit::NetworkCache::SubresourceInfo::decode):
+
+            Include key into SubresourceInfo.
+
+        (WebKit::NetworkCache::makeSubresourcesVector):
+
+            Deduplicate the entries.
+
+        (WebKit::NetworkCache::SubresourcesEntry::SubresourcesEntry):
+        (WebKit::NetworkCache::SubresourcesEntry::updateSubresourceLoads):
+        * NetworkProcess/cache/NetworkCacheSubresourcesEntry.h:
+        (WebKit::NetworkCache::SubresourceInfo::SubresourceInfo):
+        (WebKit::NetworkCache::SubresourceInfo::key):
+        (WebKit::NetworkCache::SubresourceInfo::setTransient):
+        (WebKit::NetworkCache::SubresourcesEntry::subresources):
+
+            Keep the resources in a Vector instead of a HashMap to maintain order.
+
 2017-01-23  Matt Rajca  <[email protected]>
 
         Pass down website autoplay policies to media elements

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp (211067 => 211068)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp	2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSpeculativeLoadManager.cpp	2017-01-23 23:37:42 UTC (rev 211068)
@@ -514,9 +514,8 @@
 
 void SpeculativeLoadManager::startSpeculativeRevalidation(const GlobalFrameID& frameID, SubresourcesEntry& entry)
 {
-    for (auto& subresourcePair : entry.subresources()) {
-        auto& key = subresourcePair.key;
-        auto& subresourceInfo = subresourcePair.value;
+    for (auto& subresourceInfo : entry.subresources()) {
+        auto& key = subresourceInfo.key();
         if (!subresourceInfo.isTransient())
             preloadEntry(key, subresourceInfo, frameID);
         else {

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp (211067 => 211068)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp	2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.cpp	2017-01-23 23:37:42 UTC (rev 211068)
@@ -36,6 +36,7 @@
 
 void SubresourceInfo::encode(WTF::Persistence::Encoder& encoder) const
 {
+    encoder << m_key;
     encoder << m_isTransient;
 
     // Do not bother serializing other data members of transient resources as they are empty.
@@ -49,6 +50,9 @@
 
 bool SubresourceInfo::decode(WTF::Persistence::Decoder& decoder, SubresourceInfo& info)
 {
+    if (!decoder.decode(info.m_key))
+        return false;
+
     if (!decoder.decode(info.m_isTransient))
         return false;
 
@@ -99,24 +103,42 @@
 {
     ASSERT(m_key.type() == "SubResources");
 }
+    
+static Vector<SubresourceInfo> makeSubresourceInfoVector(const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
+{
+    Vector<SubresourceInfo> result;
+    result.reserveCapacity(subresourceLoads.size());
+    
+    HashSet<Key> seenKeys;
+    for (auto& load : subresourceLoads) {
+        if (!seenKeys.add(load->key).isNewEntry)
+            continue;
+        result.append({ load->key, load->request });
+    }
 
+    return result;
+}
+
 SubresourcesEntry::SubresourcesEntry(Key&& key, const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
     : m_key(WTFMove(key))
     , m_timeStamp(std::chrono::system_clock::now())
+    , m_subresources(makeSubresourceInfoVector(subresourceLoads))
 {
     ASSERT(m_key.type() == "SubResources");
-    for (auto& subresourceLoad : subresourceLoads)
-        m_subresources.add(subresourceLoad->key, SubresourceInfo(subresourceLoad->request));
 }
 
 void SubresourcesEntry::updateSubresourceLoads(const Vector<std::unique_ptr<SubresourceLoad>>& subresourceLoads)
 {
-    auto oldSubresources = WTFMove(m_subresources);
+    HashSet<Key> previousKeys;
+    for (auto& info : m_subresources)
+        previousKeys.add(info.key());
+    
+    m_subresources = makeSubresourceInfoVector(subresourceLoads);
 
-    // Mark keys that are common with last load as non-Transient.
-    for (auto& subresourceLoad : subresourceLoads) {
-        bool isTransient = !oldSubresources.contains(subresourceLoad->key);
-        m_subresources.add(subresourceLoad->key, SubresourceInfo(subresourceLoad->request, isTransient));
+    // Mark keys that are not common with the last load as transient.
+    for (auto& subresourceInfo : m_subresources) {
+        if (!previousKeys.contains(subresourceInfo.key()))
+            subresourceInfo.setTransient();
     }
 }
 

Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h (211067 => 211068)


--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h	2017-01-23 23:26:55 UTC (rev 211067)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheSubresourcesEntry.h	2017-01-23 23:37:42 UTC (rev 211068)
@@ -43,21 +43,25 @@
     static bool decode(WTF::Persistence::Decoder&, SubresourceInfo&);
 
     SubresourceInfo() = default;
-    SubresourceInfo(const WebCore::ResourceRequest& request, bool isTransient = false)
-        : m_isTransient(isTransient)
-        , m_firstPartyForCookies(isTransient ? WebCore::URL() : request.firstPartyForCookies())
-        , m_requestHeaders(isTransient ? WebCore::HTTPHeaderMap() : request.httpHeaderFields())
+    SubresourceInfo(const Key& key, const WebCore::ResourceRequest& request)
+        : m_key(key)
+        , m_firstPartyForCookies(request.firstPartyForCookies())
+        , m_requestHeaders(request.httpHeaderFields())
         , m_priority(request.priority())
     {
     }
 
+    const Key& key() const { return m_key; }
     bool isTransient() const { return m_isTransient; }
     const WebCore::URL& firstPartyForCookies() const { ASSERT(!m_isTransient); return m_firstPartyForCookies; }
     const WebCore::HTTPHeaderMap& requestHeaders() const { ASSERT(!m_isTransient); return m_requestHeaders; }
     WebCore::ResourceLoadPriority priority() const { ASSERT(!m_isTransient); return m_priority; }
+    
+    void setTransient() { m_isTransient = true; }
 
 private:
-    bool m_isTransient { true };
+    Key m_key;
+    bool m_isTransient { false };
     WebCore::URL m_firstPartyForCookies;
     WebCore::HTTPHeaderMap m_requestHeaders;
     WebCore::ResourceLoadPriority m_priority;
@@ -86,7 +90,7 @@
 
     const Key& key() const { return m_key; }
     std::chrono::system_clock::time_point timeStamp() const { return m_timeStamp; }
-    const HashMap<Key, SubresourceInfo>& subresources() const { return m_subresources; }
+    const Vector<SubresourceInfo>& subresources() const { return m_subresources; }
 
     void updateSubresourceLoads(const Vector<std::unique_ptr<SubresourceLoad>>&);
 
@@ -93,7 +97,7 @@
 private:
     Key m_key;
     std::chrono::system_clock::time_point m_timeStamp;
-    HashMap<Key, SubresourceInfo> m_subresources;
+    Vector<SubresourceInfo> m_subresources;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to