sc/inc/rangecache.hxx              |    8 ++++----
 sc/source/core/tool/rangecache.cxx |    3 +++
 2 files changed, 7 insertions(+), 4 deletions(-)

New commits:
commit 12b8230c9e541e5bf14026ca3684e0880692e3d4
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Tue May 10 06:28:02 2022 +0200
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Wed May 11 11:50:28 2022 +0200

    faster reverse mapping in ScSortedRangeCache
    
    Profiling shows this to be a noticeable cost.
    
    Change-Id: Ib247a75b77d721f2486a1fe50eb243437d865561
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134127
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/inc/rangecache.hxx b/sc/inc/rangecache.hxx
index 0db3536b71ff..fd5b12cbd8de 100644
--- a/sc/inc/rangecache.hxx
+++ b/sc/inc/rangecache.hxx
@@ -90,16 +90,16 @@ public:
     size_t size() const { return mSortedRows.size(); }
     size_t indexForRow(SCROW row) const
     {
-        std::vector<SCROW>::const_iterator pos
-            = std::find(mSortedRows.begin(), mSortedRows.end(), row);
-        assert(pos != mSortedRows.end());
-        return pos - mSortedRows.begin();
+        assert(row >= maRange.aStart.Row() && row <= maRange.aEnd.Row());
+        assert(mRowToIndex[row - maRange.aStart.Row()] != 
mSortedRows.max_size());
+        return mRowToIndex[row - maRange.aStart.Row()];
     }
     SCROW rowForIndex(size_t index) const { return mSortedRows[index]; }
 
 private:
     // Rows sorted by their value.
     std::vector<SCROW> mSortedRows;
+    std::vector<size_t> mRowToIndex; // indexed by 'SCROW - 
maRange.aStart.Row()'
     ScRange maRange;
     ScDocument* mpDoc;
     ScSortedRangeCacheMap& mCacheMap;
diff --git a/sc/source/core/tool/rangecache.cxx 
b/sc/source/core/tool/rangecache.cxx
index 93c831e2a914..e8e49db6a8fe 100644
--- a/sc/source/core/tool/rangecache.cxx
+++ b/sc/source/core/tool/rangecache.cxx
@@ -127,6 +127,9 @@ ScSortedRangeCache::ScSortedRangeCache(ScDocument* pDoc, 
const ScRange& rRange,
             for (const RowData& d : rowData)
                 mSortedRows.emplace_back(d.row);
     }
+    mRowToIndex.resize(maRange.aEnd.Row() - maRange.aStart.Row() + 1, 
mSortedRows.max_size());
+    for (size_t i = 0; i < mSortedRows.size(); ++i)
+        mRowToIndex[mSortedRows[i] - maRange.aStart.Row()] = i;
 }
 
 void ScSortedRangeCache::Notify(const SfxHint& rHint)

Reply via email to