Kaydet (Commit) fbcdce22 authored tarafından Dennis Francis's avatar Dennis Francis

Avoid ScTokenArray thrash

Allocate ScTokenArray object only once per worker thread, fill it
for the first row/cell and reuse them for subsequent rows/cells
if possible.

Change-Id: If8f20da618938d0e189224f189b4763815702e10
üst 765c8d8b
...@@ -171,12 +171,14 @@ public: ...@@ -171,12 +171,14 @@ public:
{ {
double fNan; double fNan;
rtl::math::setNan(&fNan); rtl::math::setNan(&fNan);
ScTokenArray aCode2;
for (SCROW i = mnIdx; i <= mnLastIdx; ++i, maBatchTopPos.IncRow()) for (SCROW i = mnIdx; i <= mnLastIdx; ++i, maBatchTopPos.IncRow())
{ {
ScTokenArray aCode2;
formula::FormulaTokenArrayPlainIterator aIter(mrCode); formula::FormulaTokenArrayPlainIterator aIter(mrCode);
for (const formula::FormulaToken* p = aIter.First(); p; p = aIter.Next()) size_t nTokIdx = 0;
for (const formula::FormulaToken* p = aIter.First(); p; p = aIter.Next(), ++nTokIdx)
{ {
formula::FormulaToken* pTargetTok = aCode2.TokenAt(nTokIdx);
switch (p->GetType()) switch (p->GetType())
{ {
case formula::svSingleVectorRef: case formula::svSingleVectorRef:
...@@ -200,14 +202,25 @@ public: ...@@ -200,14 +202,25 @@ public:
{ {
// This is a string cell. // This is a string cell.
svl::SharedStringPool& rPool = mrDoc.GetSharedStringPool(); svl::SharedStringPool& rPool = mrDoc.GetSharedStringPool();
aCode2.AddString(rPool.intern(OUString(pStr))); if ( !pTargetTok )
aCode2.AddString(rPool.intern(OUString(pStr)));
else
pTargetTok->SetString(rPool.intern(OUString(pStr)));
} }
else if (rtl::math::isNan(fVal)) else if (rtl::math::isNan(fVal))
{
// Value of NaN represents an empty cell. // Value of NaN represents an empty cell.
aCode2.AddToken(ScEmptyCellToken(false, false)); if ( !pTargetTok )
aCode2.AddToken(ScEmptyCellToken(false, false));
}
else else
{
// Numeric cell. // Numeric cell.
aCode2.AddDouble(fVal); if ( !pTargetTok )
aCode2.AddDouble(fVal);
else
pTargetTok->GetDoubleAsReference() = fVal;
}
} }
break; break;
case formula::svDoubleVectorRef: case formula::svDoubleVectorRef:
...@@ -229,17 +242,29 @@ public: ...@@ -229,17 +242,29 @@ public:
aRefRange.aEnd.SetRow(mrTopPos.Row() + nRowEnd); aRefRange.aEnd.SetRow(mrTopPos.Row() + nRowEnd);
aRef.InitRange(aRefRange); aRef.InitRange(aRefRange);
formula::FormulaTokenRef xTok(new ScMatrixRangeToken(pMat, aRef)); formula::FormulaTokenRef xTok(new ScMatrixRangeToken(pMat, aRef));
aCode2.AddToken(*xTok); if ( !pTargetTok )
aCode2.AddToken(*xTok);
else
aCode2.ReplaceToken(nTokIdx, xTok.get(), formula::FormulaTokenArray::CODE_ONLY);
} }
else else
{ {
ScMatrixToken aTok(pMat); if ( !pTargetTok )
aCode2.AddToken(aTok); {
ScMatrixToken aTok(pMat);
aCode2.AddToken(aTok);
}
else
{
ScMatrixToken* pMatTok = new ScMatrixToken(pMat);
aCode2.ReplaceToken(nTokIdx, pMatTok, formula::FormulaTokenArray::CODE_ONLY);
}
} }
} }
break; break;
default: default:
aCode2.AddToken(*p); if ( !pTargetTok )
aCode2.AddToken(*p);
} // end of switch statement } // end of switch statement
} // end of formula token for loop } // end of formula token for loop
......
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