sc/inc/document.hxx | 7 +++++++ sc/source/core/data/bcaslot.cxx | 3 +++ sc/source/core/data/documen2.cxx | 4 +++- sc/source/core/data/documen7.cxx | 20 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-)
New commits: commit 5c841052abdf082b4cbe06784cfdd76f11fafef2 Author: Eike Rathke <er...@redhat.com> Date: Tue Sep 27 19:40:31 2016 +0200 sc-perf: avoid repeated TrackFormulas() during bulk broadcast, tdf#87101 rel. Multiple callers involved. Most significantly ScDocument::Broadcast() calls ScDocument::TrackFormulas() individually. Track/collect pending formula cells at the end of the bulk broadcast instead, which gives an instructions read speedup by factor 6 for the broadcast, and an overall speedup in the scenario for inserting the rows by factor ~2 wall clock time. ScDocument::InsertRows() Before, Ir Incl: 282,227,033,656 After, Ir Incl: 66,307,994,805 With cycle detection: ScDocument::TrackFormulas() Before: Ir Incl Ir Self 66,981,644,959 11,913,444,899 After: Ir Incl Ir Self 10,819,556,073 1,973,232,494 Change-Id: I85fe8b03ecb52cffaa6fa14354b3cc3467ecc111 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 79e5b83..757b878 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -478,6 +478,9 @@ private: std::unique_ptr<sc::IconSetBitmapMap> m_pIconSetBitmapMap; + bool mbTrackFormulasPending : 1; + bool mbFinalTrackFormulas : 1; + public: bool IsCellInChangeTrack(const ScAddress &cell,Color *pColCellBoder); void GetCellChangeTrackNote(const ScAddress &cell, OUString &strTrackText, bool &pbLeftEdge); @@ -2078,6 +2081,10 @@ public: void AppendToFormulaTrack( ScFormulaCell* pCell ); void RemoveFromFormulaTrack( ScFormulaCell* pCell ); void TrackFormulas( sal_uInt32 nHintId = SC_HINT_DATACHANGED ); + void SetTrackFormulasPending() { mbTrackFormulasPending = true; } + bool IsTrackFormulasPending() const { return mbTrackFormulasPending; } + void FinalTrackFormulas(); + bool IsFinalTrackFormulas() const { return mbFinalTrackFormulas; } bool IsInFormulaTree( ScFormulaCell* pCell ) const; bool IsInFormulaTrack( ScFormulaCell* pCell ) const; HardRecalcState GetHardRecalcState() { return eHardRecalcState; } diff --git a/sc/source/core/data/bcaslot.cxx b/sc/source/core/data/bcaslot.cxx index 73b5ee6..2051f2c 100644 --- a/sc/source/core/data/bcaslot.cxx +++ b/sc/source/core/data/bcaslot.cxx @@ -1099,6 +1099,9 @@ void ScBroadcastAreaSlotMachine::LeaveBulkBroadcast() { ScBroadcastAreasBulk().swap( aBulkBroadcastAreas); BulkBroadcastGroupAreas(); + // Trigger the "final" tracking. + if (pDoc->IsTrackFormulasPending()) + pDoc->FinalTrackFormulas(); } } } diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx index 534a788..fa481a3 100644 --- a/sc/source/core/data/documen2.cxx +++ b/sc/source/core/data/documen2.cxx @@ -216,7 +216,9 @@ ScDocument::ScDocument( ScDocumentMode eMode, SfxObjectShell* pDocShell ) : mbStreamValidLocked( false ), mbUserInteractionEnabled(true), mnNamedRangesLockCount(0), - mbUseEmbedFonts(false) + mbUseEmbedFonts(false), + mbTrackFormulasPending(false), + mbFinalTrackFormulas(false) { SetStorageGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT); diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx index 1a61323..d64b286 100644 --- a/sc/source/core/data/documen7.cxx +++ b/sc/source/core/data/documen7.cxx @@ -535,6 +535,21 @@ bool ScDocument::IsInFormulaTrack( ScFormulaCell* pCell ) const return pCell->GetPreviousTrack() || pFormulaTrack == pCell; } +void ScDocument::FinalTrackFormulas() +{ + mbTrackFormulasPending = false; + mbFinalTrackFormulas = true; + { + ScBulkBroadcast aBulk( GetBASM()); + // Collect all pending formula cells in bulk. + TrackFormulas(); + } + // A final round not in bulk to track all remaining formula cells and their + // dependents that were collected during ScBulkBroadcast dtor. + TrackFormulas(); + mbFinalTrackFormulas = false; +} + /* The first is broadcasted, the ones that are created through this are appended to the Track by Notify. @@ -543,6 +558,11 @@ bool ScDocument::IsInFormulaTrack( ScFormulaCell* pCell ) const */ void ScDocument::TrackFormulas( sal_uInt32 nHintId ) { + if (pBASM->IsInBulkBroadcast() && !IsFinalTrackFormulas() && nHintId == SC_HINT_DATACHANGED) + { + SetTrackFormulasPending(); + return; + } if ( pFormulaTrack ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits