diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-12-12 15:19:57 -0500 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2013-12-13 00:35:44 +0000 |
commit | da443ab58158d2b7ffa52742cec2be76e3aa2026 (patch) | |
tree | c7aacd88703f4f5ecaa7be6d134e6ecaa9d931f8 | |
parent | 137de1dce92f4cf05adefc3d0dbe09d6a2a339af (diff) |
Fix performance regression from ScMatrix conversion to multi_type_matrix.
libreoffice-4-2-milestone-5
-rw-r--r-- | sc/source/core/tool/interpr1.cxx | 66 |
1 files changed, 33 insertions, 33 deletions
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx index 9bd56805d277..19179a70505b 100644 --- a/sc/source/core/tool/interpr1.cxx +++ b/sc/source/core/tool/interpr1.cxx @@ -5277,7 +5277,9 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } else { - ScMatrixRef pResMat; + std::vector<sal_uInt8> aResArray; + size_t nRowSize = 0; + size_t nColSize = 0; double fVal = 0.0; double fSum = 0.0; double fMem = 0.0; @@ -5440,17 +5442,11 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) return 0; // initialize temporary result matrix - if (!pResMat) + if (aResArray.empty()) { - SCSIZE nResC, nResR; - nResC = nCol2 - nCol1 + 1; - nResR = nRow2 - nRow1 + 1; - pResMat = GetNewMat(nResC, nResR, false); - if (!pResMat) - { - SetError( errIllegalParameter); - return 0; - } + nColSize = nCol2 - nCol1 + 1; + nRowSize = nRow2 - nRow1 + 1; + aResArray.resize(nColSize*nRowSize, 0); } ScQueryParam rParam; @@ -5494,9 +5490,19 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) return 0; } - // query and result matrices have same geometry, and the // result matrix is filled with boolean values. - *pResMat += *pResultMatrix; + std::vector<double> aResValues; + pResultMatrix->GetDoubleArray(aResValues, true); + if (aResArray.size() != aResValues.size()) + { + SetError( errIllegalParameter); + return 0; + } + + std::vector<sal_uInt8>::iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); + std::vector<double>::const_iterator itThisRes = aResValues.begin(); + for (; itRes != itResEnd; ++itRes, ++itThisRes) + *itRes += *itThisRes; } else { @@ -5507,9 +5513,9 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) { do { - SCSIZE nC = aCellIter.GetCol() + nColDiff; - SCSIZE nR = aCellIter.GetRow() + nRowDiff; - pResMat->PutDouble(pResMat->GetDouble(nC, nR)+1.0, nC, nR); + size_t nC = aCellIter.GetCol() + nColDiff; + size_t nR = aCellIter.GetRow() + nRowDiff; + ++aResArray[nC*nRowSize+nR]; } while ( aCellIter.GetNext() ); } } @@ -5594,16 +5600,15 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) aAdr.SetTab( nMainTab1 ); if (pMainMatrix) { - std::vector<double> aResValues, aMainValues; - pResMat->GetDoubleArray(aResValues, true); + std::vector<double> aMainValues; pMainMatrix->GetDoubleArray(aMainValues, false); // Map empty values to NaN's. - if (aResValues.size() != aMainValues.size()) + if (aResArray.size() != aMainValues.size()) { SetError( errIllegalArgument); return 0; } - std::vector<double>::const_iterator itRes = aResValues.begin(), itResEnd = aResValues.end(); + std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); std::vector<double>::const_iterator itMain = aMainValues.begin(); for (; itRes != itResEnd; ++itRes, ++itMain) { @@ -5626,13 +5631,12 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } else { - SCSIZE nC, nR; - pResMat->GetDimensions(nC, nR); - for (SCSIZE nCol = 0; nCol < nC; ++nCol) + std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); + for (size_t nCol = 0; nCol < nColSize; ++nCol) { - for (SCSIZE nRow = 0; nRow < nR; ++nRow) + for (size_t nRow = 0; nRow < nRowSize; ++nRow, ++itRes) { - if (pResMat->GetDouble( nCol, nRow) == nQueryCount) + if (*itRes == nQueryCount) { aAdr.SetCol( static_cast<SCCOL>(nCol) + nMainCol1); aAdr.SetRow( static_cast<SCROW>(nRow) + nMainRow1); @@ -5657,14 +5661,10 @@ double ScInterpreter::IterateParametersIfs( ScIterFuncIfs eFunc ) } else { - SCSIZE nC, nR; - pResMat->GetDimensions(nC, nR); - for (SCSIZE nCol = 0; nCol < nC; ++nCol) - { - for (SCSIZE nRow = 0; nRow < nR; ++nRow) - if (pResMat->GetDouble( nCol, nRow) == nQueryCount) - ++fCount; - } + std::vector<sal_uInt8>::const_iterator itRes = aResArray.begin(), itResEnd = aResArray.end(); + for (; itRes != itResEnd; ++itRes) + if (*itRes == nQueryCount) + ++fCount; } switch( eFunc ) |