sc/source/core/data/segmenttree.cxx |  107 ++++++++++++++++++++++++++----------
 1 file changed, 80 insertions(+), 27 deletions(-)

New commits:
commit f9fae84cbd9663d6a394aa8e4e4b927c11384815
Author:     Noel Grandin <n...@peralex.com>
AuthorDate: Sun Apr 11 14:52:06 2021 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon Apr 12 08:27:06 2021 +0200

    tdf#130326 speed up XLSX load in ScFlatSegmentsImpl
    
    since we are iterating over the tree, use an iterator to speed
    up subsequent lookups.
    
    Takes my load time from 26.2s to 24.3s
    
    Change-Id: Iac86c9f60d447cb7679913a0585c9631f845c3e4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113948
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sc/source/core/data/segmenttree.cxx 
b/sc/source/core/data/segmenttree.cxx
index d73d233d894c..3233a074ac06 100644
--- a/sc/source/core/data/segmenttree.cxx
+++ b/sc/source/core/data/segmenttree.cxx
@@ -146,41 +146,93 @@ template<typename ValueType_, typename ExtValueType_>
 typename ScFlatSegmentsImpl<ValueType_, ExtValueType_>::ExtValueType
 ScFlatSegmentsImpl<ValueType_, ExtValueType_>::getSumValue(SCCOLROW nPos1, 
SCCOLROW nPos2)
 {
-    RangeData aData;
-    if (!getRangeData(nPos1, aData))
-        return 0;
-
-    sal_uInt32 nValue = 0;
-
-    SCROW nCurPos = nPos1;
-    SCROW nEndPos = aData.mnPos2;
-    while (nEndPos <= nPos2)
+    if (mbTreeSearchEnabled)
     {
-        sal_uInt32 nRes;
-        if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+
+        if (!maSegments.is_tree_valid())
         {
-            SAL_WARN("sc.core", "row height overflow");
-            nRes = SAL_MAX_INT32;
+            assert(!ScGlobal::bThreadedGroupCalcInProgress);
+            maSegments.build_tree();
         }
-        nValue = o3tl::saturating_add(nValue, nRes);
-        nCurPos = nEndPos + 1;
-        if (!getRangeData(nCurPos, aData))
-            break;
 
-        nEndPos = aData.mnPos2;
+        RangeData aData;
+        auto [it, found] = maSegments.search_tree(nPos1, aData.mnValue, 
&aData.mnPos1, &aData.mnPos2);
+        if (!found)
+            return 0;
+        aData.mnPos2 = aData.mnPos2-1; // end point is not inclusive.
+
+        sal_uInt32 nValue = 0;
+
+        SCROW nCurPos = nPos1;
+        SCROW nEndPos = aData.mnPos2;
+        while (nEndPos <= nPos2)
+        {
+            sal_uInt32 nRes;
+            if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+            {
+                SAL_WARN("sc.core", "row height overflow");
+                nRes = SAL_MAX_INT32;
+            }
+            nValue = o3tl::saturating_add(nValue, nRes);
+            nCurPos = nEndPos + 1;
+            auto itPair = maSegments.search(it, nCurPos, aData.mnValue, 
&aData.mnPos1, &aData.mnPos2);
+            if (!itPair.second)
+                break;
+            it = itPair.first;
+            aData.mnPos2 = aData.mnPos2-1; // end point is not inclusive.
+            nEndPos = aData.mnPos2;
+        }
+        if (nCurPos <= nPos2)
+        {
+            nEndPos = ::std::min(nEndPos, nPos2);
+            sal_uInt32 nRes;
+            if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+            {
+                SAL_WARN("sc.core", "row height overflow");
+                nRes = SAL_MAX_INT32;
+            }
+            nValue = o3tl::saturating_add(nValue, nRes);
+        }
+        return nValue;
     }
-    if (nCurPos <= nPos2)
+    else
     {
-        nEndPos = ::std::min(nEndPos, nPos2);
-        sal_uInt32 nRes;
-        if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+        RangeData aData;
+        if (!getRangeDataLeaf(nPos1, aData))
+            return 0;
+
+        sal_uInt32 nValue = 0;
+
+        SCROW nCurPos = nPos1;
+        SCROW nEndPos = aData.mnPos2;
+        while (nEndPos <= nPos2)
         {
-            SAL_WARN("sc.core", "row height overflow");
-            nRes = SAL_MAX_INT32;
+            sal_uInt32 nRes;
+            if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+            {
+                SAL_WARN("sc.core", "row height overflow");
+                nRes = SAL_MAX_INT32;
+            }
+            nValue = o3tl::saturating_add(nValue, nRes);
+            nCurPos = nEndPos + 1;
+            if (!getRangeDataLeaf(nCurPos, aData))
+                break;
+
+            nEndPos = aData.mnPos2;
         }
-        nValue = o3tl::saturating_add(nValue, nRes);
+        if (nCurPos <= nPos2)
+        {
+            nEndPos = ::std::min(nEndPos, nPos2);
+            sal_uInt32 nRes;
+            if (o3tl::checked_multiply<sal_uInt32>(aData.mnValue, nEndPos - 
nCurPos + 1, nRes))
+            {
+                SAL_WARN("sc.core", "row height overflow");
+                nRes = SAL_MAX_INT32;
+            }
+            nValue = o3tl::saturating_add(nValue, nRes);
+        }
+        return nValue;
     }
-    return nValue;
 }
 
 template<typename ValueType_, typename ExtValueType_>
@@ -195,7 +247,8 @@ bool ScFlatSegmentsImpl<ValueType_, 
ExtValueType_>::getRangeData(SCCOLROW nPos,
         maSegments.build_tree();
     }
 
-    if (!maSegments.search_tree(nPos, rData.mnValue, &rData.mnPos1, 
&rData.mnPos2).second)
+    auto it = maSegments.search_tree(nPos, rData.mnValue, &rData.mnPos1, 
&rData.mnPos2);
+    if (!it.second)
         return false;
 
     rData.mnPos2 = rData.mnPos2-1; // end point is not inclusive.
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to