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)