From 4e279e8c4986ca3de79bea2216c5783cb113a5bb Mon Sep 17 00:00:00 2001 From: Luboš Luňák Date: Tue, 1 Mar 2022 15:07:02 +0100 Subject: reuse a vector instead of repeatedly creating it (tdf#95346) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With some documents this actually is a noticeable cost. Change-Id: Ibaf2157eeba83e0c8f78c7ba058771f92bb44e24 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130795 Tested-by: Jenkins Reviewed-by: Luboš Luňák --- sc/source/filter/excel/xetable.cxx | 17 +++++++++++++---- sc/source/filter/inc/xetable.hxx | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) (limited to 'sc') diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx index f2ed192c3c40..bf50dd647933 100644 --- a/sc/source/filter/excel/xetable.cxx +++ b/sc/source/filter/excel/xetable.cxx @@ -1918,7 +1918,7 @@ void XclExpRow::AppendCell( XclExpCellRef const & xCell, bool bIsMergedBase ) InsertCell( xCell, maCellList.GetSize(), bIsMergedBase ); } -void XclExpRow::Finalize( const ScfUInt16Vec& rColXFIndexes, size_t nStartColAllDefault, bool bProgress ) +void XclExpRow::Finalize( const ScfUInt16Vec& rColXFIndexes, ScfUInt16Vec& aXFIndexes, size_t nStartColAllDefault, bool bProgress ) { size_t nPos, nSize; @@ -1928,7 +1928,11 @@ void XclExpRow::Finalize( const ScfUInt16Vec& rColXFIndexes, size_t nStartColAll size_t nColCount = GetMaxPos().Col() + 1; OSL_ENSURE( rColXFIndexes.size() == nColCount, "XclExpRow::Finalize - wrong column XF index count" ); - ScfUInt16Vec aXFIndexes( nColCount, EXC_XF_NOTFOUND ); + // The vector should be preset to all items being EXC_XF_NOTFOUND, to avoid repeated allocations + // and clearing. + assert( aXFIndexes.size() == nColCount ); + assert( aXFIndexes.front() == EXC_XF_NOTFOUND ); + assert( aXFIndexes.back() == EXC_XF_NOTFOUND ); for( nPos = 0, nSize = maCellList.GetSize(); nPos < nSize; ++nPos ) { XclExpCellBase* pCell = maCellList.GetRecord( nPos ); @@ -2084,6 +2088,9 @@ void XclExpRow::Finalize( const ScfUInt16Vec& rColXFIndexes, size_t nStartColAll else ++nPos; } + // Ensure it's all EXC_XF_NOTFOUND again for next reuse. + for( size_t i = 0; i < nStartAllNotFound; ++i ) + aXFIndexes[ i ] = EXC_XF_NOTFOUND; // progress bar includes disabled rows; only update it in the lead thread. if (bProgress) @@ -2236,8 +2243,9 @@ public: void push_back( XclExpRow *pRow ) { maRows.push_back( pRow ); } virtual void doWork() override { + ScfUInt16Vec aXFIndexes( mrColXFIndexes.size(), EXC_XF_NOTFOUND ); for (XclExpRow* p : maRows) - p->Finalize( mrColXFIndexes, mnStartColAllDefault, mbProgress ); + p->Finalize( mrColXFIndexes, aXFIndexes, mnStartColAllDefault, mbProgress ); } }; @@ -2261,8 +2269,9 @@ void XclExpRowBuffer::Finalize( XclExpDefaultRowData& rDefRowData, #endif if (nThreads == 1) { + ScfUInt16Vec aXFIndexes( rColXFIndexes.size(), EXC_XF_NOTFOUND ); for (auto& rEntry : maRowMap) - rEntry.second->Finalize( rColXFIndexes, nStartColAllDefault, true ); + rEntry.second->Finalize( rColXFIndexes, aXFIndexes, nStartColAllDefault, true ); } else { diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx index 1e9e7cd45d2c..ed16140f6d68 100644 --- a/sc/source/filter/inc/xetable.hxx +++ b/sc/source/filter/inc/xetable.hxx @@ -853,6 +853,7 @@ public: /** Converts all XF identifiers into the Excel XF indexes. */ void Finalize( const ScfUInt16Vec& rColXFIndexes, + ScfUInt16Vec& aXFIndexes, size_t nStartColAllDefault, bool bUpdateProgress ); -- cgit