sc/source/core/tool/scmatrix.cxx | 78 ++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 18 deletions(-)
New commits: commit 3ec61ffcbe95a64a2fe72f21c1ee1cd531d09755 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Thu Jan 2 14:43:04 2014 -0500 Speed up matrix element access by storing last access position. This should speed up normal element access if the elements are accessed in sequential order. Change-Id: Ia5c688ed79aabbc1fdcfc4dd5bf4b25359a585d5 diff --git a/sc/source/core/tool/scmatrix.cxx b/sc/source/core/tool/scmatrix.cxx index 1a5ebbb..ba6d578 100644 --- a/sc/source/core/tool/scmatrix.cxx +++ b/sc/source/core/tool/scmatrix.cxx @@ -191,6 +191,7 @@ _Comp CompareMatrixElemFunc<_Comp>::maComp; class ScMatrixImpl { MatrixImplType maMat; + mutable MatrixImplType::const_position_type maMatPos; MatrixImplType maMatFlag; ScInterpreter* pErrorInterpreter; bool mbCloneIfConst; // Whether the matrix is cloned with a CloneIfConst() call. @@ -287,13 +288,22 @@ private: }; ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR) : - maMat(nR, nC), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {} + maMat(nR, nC), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) +{ + maMatPos = maMat.end_position(); +} ScMatrixImpl::ScMatrixImpl(SCSIZE nC, SCSIZE nR, double fInitVal) : - maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {} + maMat(nR, nC, fInitVal), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) +{ + maMatPos = maMat.end_position(); +} ScMatrixImpl::ScMatrixImpl( size_t nC, size_t nR, const std::vector<bool>& rInitVals ) : - maMat(nR, nC, rInitVals.begin(), rInitVals.end()), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) {} + maMat(nR, nC, rInitVals.begin(), rInitVals.end()), maMatFlag(nR, nC), pErrorInterpreter(NULL), mbCloneIfConst(true) +{ + maMatPos = maMat.end_position(); +} ScMatrixImpl::~ScMatrixImpl() { @@ -303,6 +313,7 @@ ScMatrixImpl::~ScMatrixImpl() void ScMatrixImpl::Clear() { maMat.clear(); + maMatPos = maMat.end_position(); maMatFlag.clear(); } @@ -319,12 +330,14 @@ bool ScMatrixImpl::IsImmutable() const void ScMatrixImpl::Resize(SCSIZE nC, SCSIZE nR) { maMat.resize(nR, nC); + maMatPos = maMat.end_position(); maMatFlag.resize(nR, nC); } void ScMatrixImpl::Resize(SCSIZE nC, SCSIZE nR, double fVal) { maMat.resize(nR, nC, fVal); + maMatPos = maMat.end_position(); maMatFlag.resize(nR, nC); } @@ -390,7 +403,10 @@ void ScMatrixImpl::SetErrorAtInterpreter( sal_uInt16 nError ) const void ScMatrixImpl::PutDouble(double fVal, SCSIZE nC, SCSIZE nR) { if (ValidColRow( nC, nR)) + { maMat.set(nR, nC, fVal); + maMatPos = maMat.end_position(); + } else { OSL_FAIL("ScMatrixImpl::PutDouble: dimension error"); @@ -400,7 +416,10 @@ void ScMatrixImpl::PutDouble(double fVal, SCSIZE nC, SCSIZE nR) void ScMatrixImpl::PutDouble(const double* pArray, size_t nLen, SCSIZE nC, SCSIZE nR) { if (ValidColRow( nC, nR)) + { maMat.set(nR, nC, pArray, pArray + nLen); + maMatPos = maMat.end_position(); + } else { OSL_FAIL("ScMatrixImpl::PutDouble: dimension error"); @@ -417,7 +436,10 @@ void ScMatrixImpl::PutDouble( double fVal, SCSIZE nIndex) void ScMatrixImpl::PutString(const svl::SharedString& rStr, SCSIZE nC, SCSIZE nR) { if (ValidColRow( nC, nR)) + { maMat.set(nR, nC, rStr); + maMatPos = maMat.end_position(); + } else { OSL_FAIL("ScMatrixImpl::PutString: dimension error"); @@ -427,7 +449,10 @@ void ScMatrixImpl::PutString(const svl::SharedString& rStr, SCSIZE nC, SCSIZE nR void ScMatrixImpl::PutString(const svl::SharedString* pArray, size_t nLen, SCSIZE nC, SCSIZE nR) { if (ValidColRow( nC, nR)) + { maMat.set(nR, nC, pArray, pArray + nLen); + maMatPos = maMat.end_position(); + } else { OSL_FAIL("ScMatrixImpl::PutString: dimension error"); @@ -446,6 +471,7 @@ void ScMatrixImpl::PutEmpty(SCSIZE nC, SCSIZE nR) if (ValidColRow( nC, nR)) { maMat.set_empty(nR, nC); + maMatPos = maMat.end_position(); maMatFlag.set(nR, nC, false); // zero flag to indicate that this is 'empty', not 'empty path'. } else @@ -459,6 +485,7 @@ void ScMatrixImpl::PutEmptyPath(SCSIZE nC, SCSIZE nR) if (ValidColRow( nC, nR)) { maMat.set_empty(nR, nC); + maMatPos = maMat.end_position(); maMatFlag.set(nR, nC, true); // non-zero flag to indicate empty 'path'. } else @@ -470,12 +497,16 @@ void ScMatrixImpl::PutEmptyPath(SCSIZE nC, SCSIZE nR) void ScMatrixImpl::PutError( sal_uInt16 nErrorCode, SCSIZE nC, SCSIZE nR ) { maMat.set(nR, nC, CreateDoubleError(nErrorCode)); + maMatPos = maMat.end_position(); } void ScMatrixImpl::PutBoolean(bool bVal, SCSIZE nC, SCSIZE nR) { if (ValidColRow( nC, nR)) + { maMat.set(nR, nC, bVal); + maMatPos = maMat.end_position(); + } else { OSL_FAIL("ScMatrixImpl::PutBoolean: dimension error"); @@ -486,7 +517,8 @@ sal_uInt16 ScMatrixImpl::GetError( SCSIZE nC, SCSIZE nR) const { if (ValidColRowOrReplicated( nC, nR )) { - double fVal = maMat.get_numeric(nR, nC); + maMatPos = maMat.position(maMatPos, nR, nC); + double fVal = maMat.get_numeric(maMatPos); return GetDoubleErrorValue(fVal); } else @@ -500,7 +532,8 @@ double ScMatrixImpl::GetDouble(SCSIZE nC, SCSIZE nR) const { if (ValidColRowOrReplicated( nC, nR )) { - double fVal = maMat.get_numeric(nR, nC); + maMatPos = maMat.position(maMatPos, nR, nC); + double fVal = maMat.get_numeric(maMatPos); if ( pErrorInterpreter ) { sal_uInt16 nError = GetDoubleErrorValue(fVal); @@ -528,17 +561,17 @@ svl::SharedString ScMatrixImpl::GetString(SCSIZE nC, SCSIZE nR) const if (ValidColRowOrReplicated( nC, nR )) { double fErr = 0.0; - MatrixImplType::const_position_type aPos = maMat.position(nR, nC); - switch (maMat.get_type(aPos)) + maMatPos = maMat.position(maMatPos, nR, nC); + switch (maMat.get_type(maMatPos)) { case mdds::mtm::element_string: - return maMat.get_string(aPos); + return maMat.get_string(maMatPos); case mdds::mtm::element_empty: return svl::SharedString::getEmptyString(); case mdds::mtm::element_numeric: case mdds::mtm::element_boolean: OSL_FAIL("ScMatrixImpl::GetString: access error, no string"); - fErr = maMat.get_numeric(aPos); + fErr = maMat.get_numeric(maMatPos); default: OSL_FAIL("ScMatrixImpl::GetString: access error, no string"); } @@ -567,11 +600,11 @@ svl::SharedString ScMatrixImpl::GetString( SvNumberFormatter& rFormatter, SCSIZE } double fVal = 0.0; - MatrixImplType::const_position_type aPos = maMat.position(nR, nC); - switch (maMat.get_type(aPos)) + maMatPos = maMat.position(maMatPos, nR, nC); + switch (maMat.get_type(maMatPos)) { case mdds::mtm::element_string: - return maMat.get_string(aPos).getString(); + return maMat.get_string(maMatPos).getString(); case mdds::mtm::element_empty: { if (!maMatFlag.get<bool>(nR, nC)) @@ -588,7 +621,7 @@ svl::SharedString ScMatrixImpl::GetString( SvNumberFormatter& rFormatter, SCSIZE } case mdds::mtm::element_numeric: case mdds::mtm::element_boolean: - fVal = maMat.get_numeric(aPos); + fVal = maMat.get_numeric(maMatPos); break; default: ; @@ -613,21 +646,21 @@ ScMatrixValue ScMatrixImpl::Get(SCSIZE nC, SCSIZE nR) const ScMatrixValue aVal; if (ValidColRowOrReplicated(nC, nR)) { - MatrixImplType::const_position_type aPos = maMat.position(nR, nC); - mdds::mtm::element_t eType = maMat.get_type(aPos); + maMatPos = maMat.position(maMatPos, nR, nC); + mdds::mtm::element_t eType = maMat.get_type(maMatPos); switch (eType) { case mdds::mtm::element_boolean: aVal.nType = SC_MATVAL_BOOLEAN; - aVal.fVal = maMat.get_boolean(aPos); + aVal.fVal = maMat.get_boolean(maMatPos); break; case mdds::mtm::element_numeric: aVal.nType = SC_MATVAL_VALUE; - aVal.fVal = maMat.get_numeric(aPos); + aVal.fVal = maMat.get_numeric(maMatPos); break; case mdds::mtm::element_string: aVal.nType = SC_MATVAL_STRING; - aVal.aStr = maMat.get_string(aPos); + aVal.aStr = maMat.get_string(maMatPos); break; case mdds::mtm::element_empty: // Empty path equals empty plus flag. @@ -739,12 +772,14 @@ void ScMatrixImpl::MatCopy(ScMatrixImpl& mRes) const } mRes.maMat.copy(maMat); + mRes.maMatPos = mRes.maMat.end_position(); } void ScMatrixImpl::MatTrans(ScMatrixImpl& mRes) const { mRes.maMat = maMat; mRes.maMat.transpose(); + mRes.maMatPos = mRes.maMat.end_position(); } void ScMatrixImpl::FillDouble( double fVal, SCSIZE nC1, SCSIZE nR1, SCSIZE nC2, SCSIZE nR2 ) @@ -756,6 +791,7 @@ void ScMatrixImpl::FillDouble( double fVal, SCSIZE nC1, SCSIZE nR1, SCSIZE nC2, // Passing value array is much faster. std::vector<double> aVals(nR2-nR1+1, fVal); maMat.set(nR1, j, aVals.begin(), aVals.end()); + maMatPos = maMat.end_position(); } } else @@ -770,6 +806,7 @@ void ScMatrixImpl::CompareEqual() CompareMatrixElemFunc<ElemEqualZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } void ScMatrixImpl::CompareNotEqual() @@ -778,6 +815,7 @@ void ScMatrixImpl::CompareNotEqual() CompareMatrixElemFunc<ElemNotEqualZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } void ScMatrixImpl::CompareLess() @@ -786,6 +824,7 @@ void ScMatrixImpl::CompareLess() CompareMatrixElemFunc<ElemLessZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } void ScMatrixImpl::CompareGreater() @@ -794,6 +833,7 @@ void ScMatrixImpl::CompareGreater() CompareMatrixElemFunc<ElemGreaterZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } void ScMatrixImpl::CompareLessEqual() @@ -802,6 +842,7 @@ void ScMatrixImpl::CompareLessEqual() CompareMatrixElemFunc<ElemLessEqualZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } void ScMatrixImpl::CompareGreaterEqual() @@ -810,6 +851,7 @@ void ScMatrixImpl::CompareGreaterEqual() CompareMatrixElemFunc<ElemGreaterEqualZero> aFunc(aSize.row, aSize.column); maMat.walk(aFunc); aFunc.swap(maMat); + maMatPos = maMat.end_position(); } namespace { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits