sw/source/core/doc/DocumentRedlineManager.cxx |   11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

New commits:
commit 4701d17bfe785f00958ad58a63dc0ece4c5c3281
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Tue Jul 19 15:44:52 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue Jul 19 19:04:19 2022 +0200

    tdf#119840 loop backwards in DocumentRedlineManager::SplitRedline
    
    reduces load time by approx 20%
    
    Change-Id: Id1314ed640e54a104cfe26e4784c847f43ce64bf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137231
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sw/source/core/doc/DocumentRedlineManager.cxx 
b/sw/source/core/doc/DocumentRedlineManager.cxx
index dafd8642137e..0be71a74c841 100644
--- a/sw/source/core/doc/DocumentRedlineManager.cxx
+++ b/sw/source/core/doc/DocumentRedlineManager.cxx
@@ -2490,12 +2490,15 @@ void DocumentRedlineManager::CompressRedlines()
 bool DocumentRedlineManager::SplitRedline( const SwPaM& rRange )
 {
     bool bChg = false;
-    SwRedlineTable::size_type n = 0;
     const SwPosition* pStt = rRange.Start();
     const SwPosition* pEnd = rRange.End();
     //FIXME overlapping problem GetRedline( *pStt, &n );
-    for ( ; n < maRedlineTable.size(); ++n)
+    // Loop backwards, because we are mostly called with rRange pointing
+    // something near the end of the table.
+    SwRedlineTable::size_type n = maRedlineTable.size();
+    while (n != 0)
     {
+        --n;
         SwRangeRedline * pRedline = maRedlineTable[ n ];
         auto [pRedlineStart, pRedlineEnd] = pRedline->StartEnd();
         if (*pRedlineStart <= *pStt && *pEnd <= *pRedlineEnd)
@@ -2526,7 +2529,7 @@ bool DocumentRedlineManager::SplitRedline( const SwPaM& 
rRange )
 
             case 3:
                 
pRedline->InvalidateRange(SwRangeRedline::Invalidation::Remove);
-                maRedlineTable.DeleteAndDestroy( n-- );
+                maRedlineTable.DeleteAndDestroy( n );
                 pRedline = nullptr;
                 break;
             }
@@ -2539,7 +2542,7 @@ bool DocumentRedlineManager::SplitRedline( const SwPaM& 
rRange )
             if( pNew )
                 maRedlineTable.Insert( pNew, n );
         }
-        else if (*pEnd < *pRedlineStart)
+        else if (*pRedlineEnd < *pStt)
             break;
     }
     return bChg;

Reply via email to