summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-06-10 13:46:09 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-06-10 22:39:45 +0200
commit49510ead3d7de1a5c8ffe9271d10b7b121c8160b (patch)
tree3a5ffb8a7a12cbe7d25a695a6cfe30d00de15f11
parent4c36cad599add7cefa0af5ca983c81e5b085ffed (diff)
tdf#133858 opening spreadsheet with large array formula takes 10 mins
the spreadsheet has lots of SUM(IF over a whole column. Which results in us allocating a matrix with 1 million rows, which is rather slow to process. So reduce the matrix to the data that is actually there. We can only do this for some opcodes, because other opcodes act differently when referencing empty space, so for now I only perform this optimisation for the opcode in use in this spreadsheet. This takes the load time from 5m to 3s on my machine. Change-Id: I41fe9afcb0fbdf2a928a19c44a0f291a1247a41c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96022 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit 9a5f2961b085ce2f23ecdf0a03d1114bacac8e2c) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96041 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
-rw-r--r--sc/source/core/tool/interpr5.cxx9
1 files changed, 9 insertions, 0 deletions
diff --git a/sc/source/core/tool/interpr5.cxx b/sc/source/core/tool/interpr5.cxx
index aefb26c920e3..5de62ce07bfe 100644
--- a/sc/source/core/tool/interpr5.cxx
+++ b/sc/source/core/tool/interpr5.cxx
@@ -325,6 +325,15 @@ ScMatrixRef ScInterpreter::CreateMatrixFromDoubleRef( const FormulaToken* pToken
return nullptr;
}
+ // Clamp the size of the matrix to rows which actually contain data.
+ // For e.g. SUM(IF over an entire column, this can make a big difference.
+ // Limit to ocEqual opcode for now, some opcodes behaviour differently if the
+ // input has empty space.
+ if (nTab1 == nTab2 && pCur->GetOpCode() == ocEqual)
+ {
+ pDok->ShrinkToDataArea(nTab1, nCol1, nRow1, nCol2, nRow2);
+ }
+
SCSIZE nMatCols = static_cast<SCSIZE>(nCol2 - nCol1 + 1);
SCSIZE nMatRows = static_cast<SCSIZE>(nRow2 - nRow1 + 1);