Kaydet (Commit) 41ba5f64 authored tarafından Eike Rathke's avatar Eike Rathke

Perf: do not calculate a null-operation with the result matrix, tdf#58874

Change-Id: I6fe115ff7ec7960900863ddaf1cd1dc48975fd74
üst 9c32973e
...@@ -575,7 +575,7 @@ size_t GetRefListArrayMaxSize( short nParamCount ); ...@@ -575,7 +575,7 @@ size_t GetRefListArrayMaxSize( short nParamCount );
/** Switch to array reference list if current TOS is one and create/init or /** Switch to array reference list if current TOS is one and create/init or
update matrix and return true. Else return false. */ update matrix and return true. Else return false. */
bool SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent, bool SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent,
const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc ); const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc, bool bDoMatOp );
void IterateParameters( ScIterFunc, bool bTextAsZero = false ); void IterateParameters( ScIterFunc, bool bTextAsZero = false );
void ScSumSQ(); void ScSumSQ();
void ScSum(); void ScSum();
......
...@@ -3457,7 +3457,7 @@ void ScInterpreter::ScUnichar() ...@@ -3457,7 +3457,7 @@ void ScInterpreter::ScUnichar()
} }
bool ScInterpreter::SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent, bool ScInterpreter::SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, double fCurrent,
const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc ) const std::function<void( SCSIZE i, double fCurrent )>& MatOpFunc, bool bDoMatOp )
{ {
const ScRefListToken* p = dynamic_cast<const ScRefListToken*>(pStack[sp-1]); const ScRefListToken* p = dynamic_cast<const ScRefListToken*>(pStack[sp-1]);
if (!p || !p->IsArrayResult()) if (!p || !p->IsArrayResult())
...@@ -3470,7 +3470,7 @@ bool ScInterpreter::SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows, ...@@ -3470,7 +3470,7 @@ bool ScInterpreter::SwitchToArrayRefList( ScMatrixRef& xResMat, SCSIZE nMatRows,
xResMat = GetNewMat( 1, nMatRows, true); xResMat = GetNewMat( 1, nMatRows, true);
xResMat->FillDouble( fCurrent, 0,0, 0,nMatRows-1); xResMat->FillDouble( fCurrent, 0,0, 0,nMatRows-1);
} }
else else if (bDoMatOp)
{ {
// Current value and values from vector are operands // Current value and values from vector are operands
// for each vector position. // for each vector position.
...@@ -3533,8 +3533,13 @@ void ScInterpreter::ScMin( bool bTextAsZero ) ...@@ -3533,8 +3533,13 @@ void ScInterpreter::ScMin( bool bTextAsZero )
break; break;
case svRefList : case svRefList :
{ {
if (SwitchToArrayRefList( xResMat, nMatRows, nMin, MatOpFunc)) // bDoMatOp only for non-array value when switching to
// ArrayRefList.
if (SwitchToArrayRefList( xResMat, nMatRows, nMin, MatOpFunc,
nRefArrayPos == std::numeric_limits<size_t>::max()))
{
nRefArrayPos = nRefInList; nRefArrayPos = nRefInList;
}
} }
SAL_FALLTHROUGH; SAL_FALLTHROUGH;
case svDoubleRef : case svDoubleRef :
...@@ -3683,8 +3688,13 @@ void ScInterpreter::ScMax( bool bTextAsZero ) ...@@ -3683,8 +3688,13 @@ void ScInterpreter::ScMax( bool bTextAsZero )
break; break;
case svRefList : case svRefList :
{ {
if (SwitchToArrayRefList( xResMat, nMatRows, nMax, MatOpFunc)) // bDoMatOp only for non-array value when switching to
// ArrayRefList.
if (SwitchToArrayRefList( xResMat, nMatRows, nMax, MatOpFunc,
nRefArrayPos == std::numeric_limits<size_t>::max()))
{
nRefArrayPos = nRefInList; nRefArrayPos = nRefInList;
}
} }
SAL_FALLTHROUGH; SAL_FALLTHROUGH;
case svDoubleRef : case svDoubleRef :
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment