Explorar o código

LibJS: Cache valid indices in IndexedPropertyIterator

Refetching the list of indices every time we increment the iterator was
showing up hot & heavy in a profile of Discord.
Andreas Kling %!s(int64=3) %!d(string=hai) anos
pai
achega
0d60cf211d

+ 4 - 3
Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp

@@ -177,8 +177,10 @@ IndexedPropertyIterator::IndexedPropertyIterator(const IndexedProperties& indexe
     , m_index(staring_index)
     , m_skip_empty(skip_empty)
 {
-    if (m_skip_empty)
+    if (m_skip_empty) {
+        m_cached_indices = m_indexed_properties.indices();
         skip_empty_indices();
+    }
 }
 
 IndexedPropertyIterator& IndexedPropertyIterator::operator++()
@@ -203,8 +205,7 @@ bool IndexedPropertyIterator::operator!=(const IndexedPropertyIterator& other) c
 
 void IndexedPropertyIterator::skip_empty_indices()
 {
-    auto indices = m_indexed_properties.indices();
-    for (auto i : indices) {
+    for (auto i : m_cached_indices) {
         if (i < m_index)
             continue;
         m_index = i;

+ 1 - 0
Userland/Libraries/LibJS/Runtime/IndexedProperties.h

@@ -106,6 +106,7 @@ private:
     void skip_empty_indices();
 
     const IndexedProperties& m_indexed_properties;
+    Vector<u32> m_cached_indices;
     u32 m_index;
     bool m_skip_empty;
 };