[JSC] Shrink Structure size
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 11 Jun 2017 17:02:25 +0000 (17:02 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 11 Jun 2017 17:02:25 +0000 (17:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=173239

Reviewed by Mark Lam.

We find that the size of our Structure is slightly enlarged due to paddings.
By changing the order of members, we can reduce the size from 120 to 112.
This is good because 120 and 112 are categorized into different size classes.
For 120, we allocate 128 bytes. And for 112, we allocate 112 bytes.
We now save 16 bytes per Structure for free.

* runtime/ConcurrentJSLock.h:
* runtime/Structure.cpp:
(JSC::Structure::Structure):
* runtime/Structure.h:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ConcurrentJSLock.h
Source/JavaScriptCore/runtime/Structure.cpp
Source/JavaScriptCore/runtime/Structure.h

index 726c6d3..24e1cc1 100644 (file)
@@ -1,3 +1,21 @@
+2017-06-11  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        [JSC] Shrink Structure size
+        https://bugs.webkit.org/show_bug.cgi?id=173239
+
+        Reviewed by Mark Lam.
+
+        We find that the size of our Structure is slightly enlarged due to paddings.
+        By changing the order of members, we can reduce the size from 120 to 112.
+        This is good because 120 and 112 are categorized into different size classes.
+        For 120, we allocate 128 bytes. And for 112, we allocate 112 bytes.
+        We now save 16 bytes per Structure for free.
+
+        * runtime/ConcurrentJSLock.h:
+        * runtime/Structure.cpp:
+        (JSC::Structure::Structure):
+        * runtime/Structure.h:
+
 2017-06-11  Konstantin Tokarev  <annulen@yandex.ru>
 
         Unreviewed, attempt to fix JSC tests on Win after r217771
index b5c8ba4..cf59bc8 100644 (file)
@@ -40,6 +40,8 @@ typedef NoLock ConcurrentJSLock;
 typedef NoLockLocker ConcurrentJSLockerImpl;
 #endif
 
+static_assert(sizeof(ConcurrentJSLock) == 1, "Regardless of status of concurrent JS flag, size of ConurrentJSLock is always one byte.");
+
 class ConcurrentJSLockerBase : public AbstractLocker {
     WTF_MAKE_NONCOPYABLE(ConcurrentJSLockerBase);
 public:
index ce6f4bb..3db26ea 100644 (file)
@@ -181,13 +181,13 @@ Structure::Structure(VM& vm, JSGlobalObject* globalObject, JSValue prototype, co
     : JSCell(vm, vm.structureStructure.get())
     , m_blob(vm.heap.structureIDTable().allocateID(this), indexingType, typeInfo)
     , m_outOfLineTypeFlags(typeInfo.outOfLineTypeFlags())
+    , m_inlineCapacity(inlineCapacity)
+    , m_bitField(0)
     , m_globalObject(vm, this, globalObject, WriteBarrier<JSGlobalObject>::MayBeNull)
     , m_prototype(vm, this, prototype)
     , m_classInfo(classInfo)
     , m_transitionWatchpointSet(IsWatched)
     , m_offset(invalidOffset)
-    , m_inlineCapacity(inlineCapacity)
-    , m_bitField(0)
 {
     setDictionaryKind(NoneDictionaryKind);
     setIsPinnedPropertyTable(false);
@@ -214,12 +214,12 @@ const ClassInfo Structure::s_info = { "Structure", nullptr, nullptr, nullptr, CR
 
 Structure::Structure(VM& vm)
     : JSCell(CreatingEarlyCell)
+    , m_inlineCapacity(0)
+    , m_bitField(0)
     , m_prototype(vm, this, jsNull())
     , m_classInfo(info())
     , m_transitionWatchpointSet(IsWatched)
     , m_offset(invalidOffset)
-    , m_inlineCapacity(0)
-    , m_bitField(0)
 {
     setDictionaryKind(NoneDictionaryKind);
     setIsPinnedPropertyTable(false);
@@ -245,12 +245,12 @@ Structure::Structure(VM& vm)
 
 Structure::Structure(VM& vm, Structure* previous, DeferredStructureTransitionWatchpointFire* deferred)
     : JSCell(vm, vm.structureStructure.get())
+    , m_inlineCapacity(previous->m_inlineCapacity)
+    , m_bitField(0)
     , m_prototype(vm, this, previous->storedPrototype())
     , m_classInfo(previous->m_classInfo)
     , m_transitionWatchpointSet(IsWatched)
     , m_offset(invalidOffset)
-    , m_inlineCapacity(previous->m_inlineCapacity)
-    , m_bitField(0)
 {
     setDictionaryKind(previous->dictionaryKind());
     setIsPinnedPropertyTable(previous->hasBeenFlattenedBefore());
index b0f43b7..eb1aa7e 100644 (file)
@@ -760,6 +760,12 @@ private:
     StructureIDBlob m_blob;
     TypeInfo::OutOfLineTypeFlags m_outOfLineTypeFlags;
 
+    uint8_t m_inlineCapacity;
+
+    ConcurrentJSLock m_lock;
+
+    uint32_t m_bitField;
+
     WriteBarrier<JSGlobalObject> m_globalObject;
     WriteBarrier<Unknown> m_prototype;
     mutable WriteBarrier<StructureChain> m_cachedPrototypeChain;
@@ -784,12 +790,6 @@ private:
 
     // m_offset does not account for anonymous slots
     PropertyOffset m_offset;
-
-    uint8_t m_inlineCapacity;
-    
-    ConcurrentJSLock m_lock;
-    
-    uint32_t m_bitField;
 };
 
 } // namespace JSC