2008-09-15 Sam Weinig <sam@webkit.org>
authorweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Sep 2008 07:27:14 +0000 (07:27 +0000)
committerweinig@apple.com <weinig@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Sep 2008 07:27:14 +0000 (07:27 +0000)
        Reviewed by Maciej Stachowiak.

        Patch for https://bugs.webkit.org/show_bug.cgi?id=20849
        Cache property names for getEnumerablePropertyNames in the StructureID.

        ~0.5% speedup on Sunspider overall (9.7% speedup on string-fasta).  ~1% speedup
        on the v8 test suite.

        * kjs/JSObject.cpp:
        (JSC::JSObject::getPropertyNames):
        * kjs/PropertyMap.cpp:
        (JSC::PropertyMap::getEnumerablePropertyNames):
        * kjs/PropertyMap.h:
        * kjs/StructureID.cpp:
        (JSC::StructureID::StructureID):
        (JSC::StructureID::getEnumerablePropertyNames):
        * kjs/StructureID.h:

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

JavaScriptCore/ChangeLog
JavaScriptCore/kjs/JSObject.cpp
JavaScriptCore/kjs/PropertyMap.cpp
JavaScriptCore/kjs/PropertyMap.h
JavaScriptCore/kjs/StructureID.cpp
JavaScriptCore/kjs/StructureID.h

index 80bf354d80d389e25d5864f5c937bf8b1086c114..be6895802ffd470fda690da40d7d19e4d19042b3 100644 (file)
@@ -1,3 +1,23 @@
+2008-09-15  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Maciej Stachowiak.
+
+        Patch for https://bugs.webkit.org/show_bug.cgi?id=20849
+        Cache property names for getEnumerablePropertyNames in the StructureID.
+
+        ~0.5% speedup on Sunspider overall (9.7% speedup on string-fasta).  ~1% speedup
+        on the v8 test suite.
+
+        * kjs/JSObject.cpp:
+        (JSC::JSObject::getPropertyNames):
+        * kjs/PropertyMap.cpp:
+        (JSC::PropertyMap::getEnumerablePropertyNames):
+        * kjs/PropertyMap.h:
+        * kjs/StructureID.cpp:
+        (JSC::StructureID::StructureID):
+        (JSC::StructureID::getEnumerablePropertyNames):
+        * kjs/StructureID.h:
+
 2008-09-14  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Cameron Zwarich.
index 342268e948c00f4ebf9f9d31e59eaf1ebee39e9f..4500e2c63652c92a577b29228799e1b8bacd6c44 100644 (file)
@@ -432,7 +432,7 @@ bool JSObject::getPropertyAttributes(ExecState* exec, const Identifier& property
 
 void JSObject::getPropertyNames(ExecState* exec, PropertyNameArray& propertyNames)
 {
-    m_structureID->propertyMap().getEnumerablePropertyNames(propertyNames);
+    m_structureID->getEnumerablePropertyNames(propertyNames);
 
     // Add properties from the static hashtables of properties
     for (const ClassInfo* info = classInfo(); info; info = info->parentClass) {
index d12e138d9f7a120a939fa85157361c33d0e38bd4..00b1ec7b9e919072174d89664d84da5431bcc5f4 100644 (file)
@@ -23,7 +23,6 @@
 
 #include "JSObject.h"
 #include "protect.h"
-#include "PropertyNameArray.h"
 #include <algorithm>
 #include <wtf/Assertions.h>
 #include <wtf/FastMalloc.h>
@@ -473,7 +472,7 @@ static int comparePropertyMapEntryIndices(const void* a, const void* b)
     return 0;
 }
 
-void PropertyMap::getEnumerablePropertyNames(PropertyNameArray& propertyNames) const
+void PropertyMap::getEnumerablePropertyNames(Vector<UString::Rep*>& propertyNames) const
 {
     if (!m_table)
         return;
@@ -492,13 +491,9 @@ void PropertyMap::getEnumerablePropertyNames(PropertyNameArray& propertyNames) c
                 ++i;
             }
         }
-        if (!propertyNames.size()) {
-            for (int k = 0; k < i; ++k)
-                propertyNames.addKnownUnique(a[k]->key);
-        } else {
-            for (int k = 0; k < i; ++k)
-                propertyNames.add(a[k]->key);
-        }
+        propertyNames.reserveCapacity(i);
+        for (int k = 0; k < i; ++k)
+            propertyNames.append(a[k]->key);
         return;
     }
 
@@ -517,8 +512,9 @@ void PropertyMap::getEnumerablePropertyNames(PropertyNameArray& propertyNames) c
     qsort(sortedEnumerables.data(), p - sortedEnumerables.data(), sizeof(Entry*), comparePropertyMapEntryIndices);
 
     // Put the keys of the sorted entries into the list.
-    for (Entry** q = sortedEnumerables.data(); q != p; ++q)
-        propertyNames.add(q[0]->key);
+    propertyNames.reserveCapacity(sortedEnumerables.size());
+    for (size_t i = 0; i < sortedEnumerables.size(); ++i)
+        propertyNames.append(sortedEnumerables[i]->key);
 }
 
 #if DO_PROPERTYMAP_CONSTENCY_CHECK
index 0fe6b36ea29ede09a799b4dceff17983098de611..bb87dc6cadffe20b8302ccab4c13d986e2dd30e9 100644 (file)
@@ -30,7 +30,6 @@ namespace JSC {
 
     class JSObject;
     class JSValue;
-    class PropertyNameArray;
 
     typedef JSValue** PropertyStorage;
 
@@ -94,7 +93,7 @@ namespace JSC {
         size_t getOffset(const Identifier& propertyName);
         size_t getOffset(const Identifier& propertyName, unsigned& attributes);
 
-        void getEnumerablePropertyNames(PropertyNameArray&) const;
+        void getEnumerablePropertyNames(Vector<UString::Rep*>&) const;
 
         bool hasGetterSetterProperties() const { return m_getterSetterFlag; }
         void setHasGetterSetterProperties(bool f) { m_getterSetterFlag = f; }
index 0f35379246cd459b6d6af6f3014bd9d39ac91428..bf203a201812a88899103114cc89e1894f5b91c4 100644 (file)
 
 #include "identifier.h"
 #include "JSObject.h"
+#include "PropertyNameArray.h";
 #include <wtf/RefPtr.h>
 
 using namespace std;
 
 namespace JSC {
 
-    StructureID::StructureID(JSValue* prototype, JSType type)
+StructureID::StructureID(JSValue* prototype, JSType type)
     : m_isDictionary(false)
     , m_type(type)
     , m_prototype(prototype)
@@ -47,6 +48,20 @@ namespace JSC {
     ASSERT(m_prototype->isObject() || m_prototype->isNull());
 }
 
+void StructureID::getEnumerablePropertyNames(PropertyNameArray& propertyNames) const
+{
+    if (m_cachedPropertyNameArray.isEmpty())
+        m_propertyMap.getEnumerablePropertyNames(m_cachedPropertyNameArray);
+
+    if (!propertyNames.size()) {
+        for (size_t i = 0; i < m_cachedPropertyNameArray.size(); ++i)
+            propertyNames.addKnownUnique(m_cachedPropertyNameArray[i]);
+    } else {
+        for (size_t i = 0; i < m_cachedPropertyNameArray.size(); ++i)
+            propertyNames.add(m_cachedPropertyNameArray[i]);
+    }
+}
+
 void StructureID::transitionTo(StructureID* oldStructureID, StructureID* newStructureID, JSObject* slotBase)
 {
     if (!slotBase->usingInlineStorage() && oldStructureID->m_propertyMap.size() != newStructureID->m_propertyMap.size())
index 346aa7dbe1bf56da3e6324c059e626f6e4496fbd..9e770c6dad7da9ddaf4f4dc1494aeba166ab8e36 100644 (file)
@@ -39,6 +39,7 @@
 namespace JSC {
 
     class JSValue;
+    class PropertyNameArray;
     class StructureIDChain;
 
     struct TransitionTableHash {
@@ -107,6 +108,8 @@ namespace JSC {
         const PropertyMap& propertyMap() const { return m_propertyMap; }
         PropertyMap& propertyMap() { return m_propertyMap; }
 
+        void getEnumerablePropertyNames(PropertyNameArray&) const;
+
         static void transitionTo(StructureID* oldStructureID, StructureID* newStructureID, JSObject* slotBase);
 
     private:
@@ -130,6 +133,8 @@ namespace JSC {
         size_t m_transitionCount;
         TransitionTable m_transitionTable;
 
+        mutable Vector<UString::Rep*> m_cachedPropertyNameArray;
+
         PropertyMap m_propertyMap;
     };