[JSC] Optimize layout of AccessCase / ProxyableAccessCase to reduce size of Proxyable...
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jul 2018 17:08:17 +0000 (17:08 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 9 Jul 2018 17:08:17 +0000 (17:08 +0000)
https://bugs.webkit.org/show_bug.cgi?id=187465

Reviewed by Keith Miller.

ProxyableAccessCase is allocated so frequently and it is persisted so long. Reducing the size
of ProxyableAccessCase can reduce the footprint of many web sites including nytimes.com.

This patch uses a bit complicated layout to reduce ProxyableAccessCase. We add unused bool member
in AccessCase's padding, and use it in ProxyableAccessCase. By doing so, we can reduce the size
of ProxyableAccessCase from 56 to 48. And it also reduces the size of GetterSetterAccessCase
from 104 to 96 since it inherits ProxyableAccessCase.

* bytecode/AccessCase.h:
(JSC::AccessCase::viaProxy const):
(JSC::AccessCase::AccessCase):
* bytecode/ProxyableAccessCase.cpp:
(JSC::ProxyableAccessCase::ProxyableAccessCase):
* bytecode/ProxyableAccessCase.h:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/AccessCase.h
Source/JavaScriptCore/bytecode/ProxyableAccessCase.cpp
Source/JavaScriptCore/bytecode/ProxyableAccessCase.h

index 835382a..2d0f325 100644 (file)
@@ -1,3 +1,25 @@
+2018-07-09  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Optimize layout of AccessCase / ProxyableAccessCase to reduce size of ProxyableAccessCase
+        https://bugs.webkit.org/show_bug.cgi?id=187465
+
+        Reviewed by Keith Miller.
+
+        ProxyableAccessCase is allocated so frequently and it is persisted so long. Reducing the size
+        of ProxyableAccessCase can reduce the footprint of many web sites including nytimes.com.
+
+        This patch uses a bit complicated layout to reduce ProxyableAccessCase. We add unused bool member
+        in AccessCase's padding, and use it in ProxyableAccessCase. By doing so, we can reduce the size
+        of ProxyableAccessCase from 56 to 48. And it also reduces the size of GetterSetterAccessCase
+        from 104 to 96 since it inherits ProxyableAccessCase.
+
+        * bytecode/AccessCase.h:
+        (JSC::AccessCase::viaProxy const):
+        (JSC::AccessCase::AccessCase):
+        * bytecode/ProxyableAccessCase.cpp:
+        (JSC::ProxyableAccessCase::ProxyableAccessCase):
+        * bytecode/ProxyableAccessCase.h:
+
 2018-07-08  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Unreviewed, build fix for debug builds after r233630
index 21dc3f2..170af5d 100644 (file)
@@ -156,7 +156,7 @@ public:
     virtual JSObject* alternateBase() const;
     
     virtual WatchpointSet* additionalSet() const { return nullptr; }
-    virtual bool viaProxy() const { return false; }
+    bool viaProxy() const { return m_viaProxy; }
 
     // If you supply the optional vector, this will append the set of cells that this will need to keep alive
     // past the call.
@@ -203,6 +203,7 @@ protected:
     AccessCase(const AccessCase& other)
         : m_type(other.m_type)
         , m_state(other.m_state)
+        , m_viaProxy(other.m_viaProxy)
         , m_offset(other.m_offset)
         , m_structure(other.m_structure)
         , m_conditionSet(other.m_conditionSet)
@@ -241,6 +242,12 @@ private:
 
     AccessType m_type;
     State m_state { Primordial };
+protected:
+    // m_viaProxy is true only if the instance inherits (or it is) ProxyableAccessCase.
+    // We put this value here instead of ProxyableAccessCase to reduce the size of ProxyableAccessCase and its
+    // derived classes, which are super frequently allocated.
+    bool m_viaProxy { false };
+private:
     PropertyOffset m_offset;
 
     // Usually this is the structure that we expect the base object to have. But, this is the *new*
index b31a31f..0f28513 100644 (file)
@@ -33,9 +33,9 @@ namespace JSC {
 ProxyableAccessCase::ProxyableAccessCase(VM& vm, JSCell* owner, AccessType accessType, PropertyOffset offset, Structure* structure,
     const ObjectPropertyConditionSet& conditionSet, bool viaProxy, WatchpointSet* additionalSet, std::unique_ptr<PolyProtoAccessChain> prototypeAccessChain)
     : Base(vm, owner, accessType, offset, structure, conditionSet, WTFMove(prototypeAccessChain))
-    , m_viaProxy(viaProxy)
     , m_additionalSet(additionalSet)
 {
+    m_viaProxy = viaProxy;
 }
 
 std::unique_ptr<AccessCase> ProxyableAccessCase::create(VM& vm, JSCell* owner, AccessType type, PropertyOffset offset, Structure* structure, const ObjectPropertyConditionSet& conditionSet, bool viaProxy, WatchpointSet* additionalSet, std::unique_ptr<PolyProtoAccessChain> prototypeAccessChain)
index 5d3b9c3..a8e8cb2 100644 (file)
@@ -35,7 +35,6 @@ class ProxyableAccessCase : public AccessCase {
 public:
     using Base = AccessCase;
 
-    bool viaProxy() const override { return m_viaProxy; }
     WatchpointSet* additionalSet() const override { return m_additionalSet.get(); }
 
     static std::unique_ptr<AccessCase> create(VM&, JSCell*, AccessType, PropertyOffset, Structure*, const ObjectPropertyConditionSet& = ObjectPropertyConditionSet(),
@@ -50,7 +49,6 @@ protected:
     ProxyableAccessCase(VM&, JSCell*, AccessType, PropertyOffset, Structure*, const ObjectPropertyConditionSet&, bool viaProxy, WatchpointSet* additionalSet, std::unique_ptr<PolyProtoAccessChain>);
 
 private:
-    bool m_viaProxy;
     RefPtr<WatchpointSet> m_additionalSet;
 };