summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2022-05-10 21:30:31 +0200
committerLuboš Luňák <l.lunak@collabora.com>2022-05-11 11:52:04 +0200
commita49afabb0cf1eac8f1214bfada0d7c9bc662878e (patch)
tree505f8f21e0ae12aa994990e67ea7eff839dbe5ec
parent248e49d3f409d414331945ba91b3083406d59f78 (diff)
reduce size of *IFS conditions array (tdf#144777)
The array is used to count the number of matching conditions e.g. in COUNTIFS, which can be only up to nQueryCount, which is sal_uInt8. So there's no need to count it as sal_uInt32, and doing so may cause 4MiB array per thread for full-column references, which causes easily causes 60% of time spent just clearing and checking the complete array. Change-Id: Id4bebf90619f7f2a721edb9cd31e6a11469579aa Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134138 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r--sc/inc/interpretercontext.hxx2
-rw-r--r--sc/source/core/tool/interpr1.cxx16
2 files changed, 9 insertions, 9 deletions
diff --git a/sc/inc/interpretercontext.hxx b/sc/inc/interpretercontext.hxx
index 07e20f3a887e..9f424b1a4f42 100644
--- a/sc/inc/interpretercontext.hxx
+++ b/sc/inc/interpretercontext.hxx
@@ -61,7 +61,7 @@ struct ScInterpreterContext
std::unique_ptr<ScSortedRangeCacheMap> mxScSortedRangeCache; // cache for unsorted lookups
// Allocation cache for "aConditions" array in ScInterpreter::IterateParameterIfs()
// This is populated/used only when formula-group threading is enabled.
- std::vector<sal_uInt32> maConditions;
+ std::vector<sal_uInt8> maConditions;
ScInterpreter* pInterpreter;
ScInterpreterContext(const ScDocument& rDoc, SvNumberFormatter* pFormatter);
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index afd9079de498..ce05f771bd6d 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -5827,7 +5827,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
sal_uInt8 nParamCount = GetByte();
sal_uInt8 nQueryCount = nParamCount / 2;
- std::vector<sal_uInt32>& vConditions = mrContext.maConditions;
+ std::vector<sal_uInt8>& vConditions = mrContext.maConditions;
// vConditions is cached, although it is clear'ed after every cell is interpreted,
// if the SUMIFS/COUNTIFS are part of a matrix formula, then that is not enough because
// with a single InterpretTail() call it results in evaluation of all the cells in the
@@ -5886,7 +5886,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
SCCOL nDimensionCols = 0;
SCROW nDimensionRows = 0;
const SCSIZE nRefArrayRows = GetRefListArrayMaxSize( nParamCount);
- std::vector<std::vector<sal_uInt32>> vRefArrayConditions;
+ std::vector<std::vector<sal_uInt8>> vRefArrayConditions;
while (nParamCount > 1 && nGlobalError == FormulaError::NONE)
{
@@ -6016,7 +6016,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
}
// Reset condition results.
std::for_each( vConditions.begin(), vConditions.end(),
- [](sal_uInt32 & r){ r = 0.0; } );
+ [](sal_uInt8 & r){ r = 0.0; } );
}
}
nRefArrayPos = nRefInList;
@@ -6192,7 +6192,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
if (nRefArrayPos != std::numeric_limits<size_t>::max())
{
// Apply condition result to reference list array result position.
- std::vector<sal_uInt32>& rVec = vRefArrayConditions[nRefArrayPos];
+ std::vector<sal_uInt8>& rVec = vRefArrayConditions[nRefArrayPos];
if (rVec.empty())
rVec = vConditions;
else
@@ -6207,9 +6207,9 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
// When leaving an svRefList this has to be emptied not set to
// 0.0 because it's checked when entering an svRefList.
if (nRefInList == 0)
- std::vector<sal_uInt32>().swap( vConditions);
+ std::vector<sal_uInt8>().swap( vConditions);
else
- std::for_each( vConditions.begin(), vConditions.end(), [](sal_uInt32 & r){ r = 0.0; } );
+ std::for_each( vConditions.begin(), vConditions.end(), [](sal_uInt8 & r){ r = 0; } );
}
}
nParamCount -= 2;
@@ -6392,7 +6392,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
return;
}
- std::vector<sal_uInt32>::const_iterator itRes = vConditions.begin(), itResEnd = vConditions.end();
+ std::vector<sal_uInt8>::const_iterator itRes = vConditions.begin(), itResEnd = vConditions.end();
std::vector<double>::const_iterator itMain = aMainValues.begin();
for (; itRes != itResEnd; ++itRes, ++itMain)
{
@@ -6427,7 +6427,7 @@ void ScInterpreter::IterateParametersIfs( double(*ResultFunc)( const sc::ParamIf
if (nRefArrayMainPos < vRefArrayConditions.size())
vConditions = vRefArrayConditions[nRefArrayMainPos];
- std::vector<sal_uInt32>::const_iterator itRes = vConditions.begin();
+ std::vector<sal_uInt8>::const_iterator itRes = vConditions.begin();
for (SCCOL nCol = 0; nCol < nDimensionCols; ++nCol)
{
for (SCROW nRow = 0; nRow < nDimensionRows; ++nRow, ++itRes)