From 0d60cf211dc81cf2787a68e90d0e950165063aa2 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 5 Feb 2022 17:59:14 +0100 Subject: [PATCH] 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. --- Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp | 7 ++++--- Userland/Libraries/LibJS/Runtime/IndexedProperties.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp b/Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp index b8bef63734..1d7bd301e5 100644 --- a/Userland/Libraries/LibJS/Runtime/IndexedProperties.cpp +++ b/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; diff --git a/Userland/Libraries/LibJS/Runtime/IndexedProperties.h b/Userland/Libraries/LibJS/Runtime/IndexedProperties.h index db9777369e..53792f5746 100644 --- a/Userland/Libraries/LibJS/Runtime/IndexedProperties.h +++ b/Userland/Libraries/LibJS/Runtime/IndexedProperties.h @@ -106,6 +106,7 @@ private: void skip_empty_indices(); const IndexedProperties& m_indexed_properties; + Vector m_cached_indices; u32 m_index; bool m_skip_empty; };