[Libreoffice-commits] core.git: sc/source

Eike Rathke erack at redhat.com
Tue Jun 6 22:51:43 UTC 2017


 sc/source/core/data/markarr.cxx |   11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

New commits:
commit 59c9d0653cc42560af48269bb8dee2c2b0b20f68
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Jun 7 00:49:47 2017 +0200

    Perf-sc: tdf#100709 Use a "one and a half" alloc strategy for ScMarkArray
    
    ScMarkArray::SetMarkArea()
    before, Ir:   3 059 572 314
     after, Ir:   1 195 743 815
    
    ScDocShell::Load()
    before, Ir:  17 337 645 368
     after, Ir:  15 497 093 406
    
    Change-Id: I83959f0dfcf6480781a44b5cfc36242a5c35ebd4

diff --git a/sc/source/core/data/markarr.cxx b/sc/source/core/data/markarr.cxx
index 52b7597fe1cd..248ddd0cb4c0 100644
--- a/sc/source/core/data/markarr.cxx
+++ b/sc/source/core/data/markarr.cxx
@@ -121,7 +121,16 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW nEndRow, bool bMarked )
                 SCSIZE nNeeded = nCount + 2;
                 if ( nLimit < nNeeded )
                 {
-                    nLimit += SC_MARKARRAY_DELTA;
+                    // Assume that if it grew already beyond a certain
+                    // threshold it will continue to grow and avoid the
+                    // bottleneck of lots of reallocations in small steps.
+                    // Don't use a simple "double amount" strategy though as
+                    // that again may allocate much more than actually needed.
+                    // The "one and a half" is just a shot into the blue sky.
+                    if (nLimit > 4 * SC_MARKARRAY_DELTA)
+                        nLimit += nLimit / 2;
+                    else
+                        nLimit += SC_MARKARRAY_DELTA;
                     if ( nLimit < nNeeded )
                         nLimit = nNeeded;
                     ScMarkEntry* pNewData = new ScMarkEntry[nLimit];


More information about the Libreoffice-commits mailing list