sc/source/core/inc/interpre.hxx | 12 ++++ sc/source/core/tool/interpr1.cxx | 101 ++++++++++++++++++--------------------- 2 files changed, 58 insertions(+), 55 deletions(-)
New commits: commit ab3f76d5aef497e67ecc072117a9bc2a939388b2 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Wed Oct 12 20:29:34 2016 -0400 Remove the branching at the end of IterateParametersIfs(). For (hopefully) better performance. Change-Id: I59ed454aa9ace2f945facceee14f4e25610feebf diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx index a01b60b..4fe6e56 100644 --- a/sc/source/core/inc/interpre.hxx +++ b/sc/source/core/inc/interpre.hxx @@ -39,6 +39,7 @@ #include <map> #include <memory> #include <vector> +#include <limits> class ScDocument; class SbxVariable; @@ -62,6 +63,15 @@ struct RangeMatrix; struct Compare; struct CompareOptions; +struct ParamIfsResult +{ + double mfSum = 0.0; + double mfMem = 0.0; + double mfCount = 0.0; + double mfMin = std::numeric_limits<double>::max(); + double mfMax = std::numeric_limits<double>::min(); +}; + } namespace svl { @@ -555,7 +565,7 @@ double IterateParametersIf( ScIterFuncIf ); void ScCountIf(); void ScSumIf(); void ScAverageIf(); -double IterateParametersIfs( ScIterFuncIfs ); +void IterateParametersIfs( sc::ParamIfsResult& rRes ); void ScSumIfs(); void ScAverageIfs(); void ScCountIfs(); diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 239bb74..532783c 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -5311,7 +5311,7 @@ void ScInterpreter::ScCountIf() } } -double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) +void ScInterpreter::IterateParametersIfs( sc::ParamIfsResult& rRes ) { sal_uInt8 nParamCount = GetByte(); sal_uInt8 nQueryCount = nParamCount / 2; @@ -5320,12 +5320,6 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) size_t nRowSize = 0; size_t nColSize = 0; double fVal = 0.0; - double fSum = 0.0; - double fMem = 0.0; - double fRes = 0.0; - double fCount = 0.0; - double fMin = std::numeric_limits<double>::max(); - double fMax = std::numeric_limits<double>::min(); short nParam = 1; size_t nRefInList = 0; SCCOL nDimensionCols = 0; @@ -5344,7 +5338,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) { ScAddress aAdr; if ( !PopDoubleRefOrSingleRef( aAdr ) ) - return 0; + return; ScRefCellValue aCell(*pDok, aAdr); switch (aCell.meType) @@ -5406,7 +5400,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } if (nGlobalError) - return 0; // and bail out, no need to evaluate other arguments + return; // and bail out, no need to evaluate other arguments // take range nParam = 1; @@ -5444,7 +5438,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (!pQueryMatrix) { SetError( errIllegalParameter); - return 0; + return; } nCol1 = 0; nRow1 = 0; @@ -5458,12 +5452,12 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) break; default: SetError( errIllegalParameter); - return 0; + return; } if ( nTab1 != nTab2 ) { SetError( errIllegalArgument); - return 0; + return; } // All reference ranges must be of same dimension and size. @@ -5474,12 +5468,12 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if ((nDimensionCols != (nCol2 - nCol1 + 1)) || (nDimensionRows != (nRow2 - nRow1 + 1))) { SetError ( errIllegalArgument); - return 0; + return; } // recalculate matrix values if (nGlobalError) - return 0; + return; // initialize temporary result matrix if (aResArray.empty()) @@ -5523,7 +5517,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (nGlobalError || !pResultMatrix) { SetError( errIllegalParameter); - return 0; + return; } // result matrix is filled with boolean values. @@ -5532,7 +5526,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (aResArray.size() != aResValues.size()) { SetError( errIllegalParameter); - return 0; + return; } std::vector<sal_uInt8>::iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); @@ -5559,7 +5553,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } if (nGlobalError) - return 0; // bail out + return; // bail out // main range - only for AVERAGEIFS, SUMIFS, MINIFS and MAXIFS if (nParamCount == 1) @@ -5600,7 +5594,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (!pMainMatrix) { SetError( errIllegalParameter); - return 0; + return; } nMainCol1 = 0; nMainRow1 = 0; @@ -5614,23 +5608,23 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) break; default: SetError( errIllegalParameter); - return 0; + return; } if ( nMainTab1 != nMainTab2 ) { SetError( errIllegalArgument); - return 0; + return; } // All reference ranges must be of same dimension and size. if ((nDimensionCols != (nMainCol2 - nMainCol1 + 1)) || (nDimensionRows != (nMainRow2 - nMainRow1 + 1))) { SetError ( errIllegalArgument); - return 0; + return; } if (nGlobalError) - return 0; // bail out + return; // bail out // end-result calculation ScAddress aAdr; @@ -5642,7 +5636,7 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (aResArray.size() != aMainValues.size()) { SetError( errIllegalArgument); - return 0; + return; } std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); @@ -5656,18 +5650,18 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (GetDoubleErrorValue(fVal) == errElementNaN) continue; - ++fCount; + ++rRes.mfCount; if (bNull && fVal != 0.0) { bNull = false; - fMem = fVal; + rRes.mfMem = fVal; } else - fSum += fVal; - if ( fMin > fVal ) - fMin = fVal; - if ( fMax < fVal ) - fMax = fVal; + rRes.mfSum += fVal; + if ( rRes.mfMin > fVal ) + rRes.mfMin = fVal; + if ( rRes.mfMax < fVal ) + rRes.mfMax = fVal; } } else @@ -5685,18 +5679,18 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) if (aCell.hasNumeric()) { fVal = GetCellValue(aAdr, aCell); - ++fCount; + ++rRes.mfCount; if ( bNull && fVal != 0.0 ) { bNull = false; - fMem = fVal; + rRes.mfMem = fVal; } else - fSum += fVal; - if ( fMin > fVal ) - fMin = fVal; - if ( fMax < fVal ) - fMax = fVal; + rRes.mfSum += fVal; + if ( rRes.mfMin > fVal ) + rRes.mfMin = fVal; + if ( rRes.mfMax < fVal ) + rRes.mfMax = fVal; } } } @@ -5708,19 +5702,8 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); for (; itRes != itResEnd; ++itRes) if (*itRes == nQueryCount) - ++fCount; + ++rRes.mfCount; } - - switch( eFunc ) - { - case ifSUMIFS: fRes = ::rtl::math::approxAdd( fSum, fMem ); break; - case ifAVERAGEIFS: fRes = div( ::rtl::math::approxAdd( fSum, fMem ), fCount); break; - case ifCOUNTIFS: fRes = fCount; break; - case ifMINIFS: fRes = ( fMin < std::numeric_limits<double>::max() ? fMin : 0 ); break; - case ifMAXIFS: fRes = ( fMax > std::numeric_limits<double>::min() ? fMax : 0 ); break; - default: ; // nothing - } - return fRes; } void ScInterpreter::ScSumIfs() @@ -5733,7 +5716,9 @@ void ScInterpreter::ScSumIfs() return; } - PushDouble( IterateParametersIfs( ifSUMIFS)); + sc::ParamIfsResult aRes; + IterateParametersIfs(aRes); + PushDouble(rtl::math::approxAdd(aRes.mfSum, aRes.mfMem)); } void ScInterpreter::ScAverageIfs() @@ -5746,7 +5731,9 @@ void ScInterpreter::ScAverageIfs() return; } - PushDouble( IterateParametersIfs( ifAVERAGEIFS)); + sc::ParamIfsResult aRes; + IterateParametersIfs(aRes); + PushDouble(div(rtl::math::approxAdd(aRes.mfSum, aRes.mfMem), aRes.mfCount)); } void ScInterpreter::ScCountIfs() @@ -5759,7 +5746,9 @@ void ScInterpreter::ScCountIfs() return; } - PushDouble( IterateParametersIfs( ifCOUNTIFS)); + sc::ParamIfsResult aRes; + IterateParametersIfs(aRes); + PushDouble(aRes.mfCount); } void ScInterpreter::ScMinIfs_MS() @@ -5772,7 +5761,9 @@ void ScInterpreter::ScMinIfs_MS() return; } - PushDouble( IterateParametersIfs( ifMINIFS ) ); + sc::ParamIfsResult aRes; + IterateParametersIfs(aRes); + PushDouble((aRes.mfMin < std::numeric_limits<double>::max()) ? aRes.mfMin : 0.0); } @@ -5786,7 +5777,9 @@ void ScInterpreter::ScMaxIfs_MS() return; } - PushDouble( IterateParametersIfs( ifMAXIFS ) ); + sc::ParamIfsResult aRes; + IterateParametersIfs(aRes); + PushDouble((aRes.mfMax > std::numeric_limits<double>::min()) ? aRes.mfMax : 0.0); } void ScInterpreter::ScLookup() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits