diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2014-05-21 14:26:27 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2014-05-21 16:55:41 +0100 |
commit | 34f0e4f42594adb97bdb64e5f2e8f00801b48e2e (patch) | |
tree | 3bba2f81c9ea3b34580f76cad03aad2af979bb2d | |
parent | 1554fc9611e44d55eacc577bfed51d0f9c1c3a25 (diff) |
ODS load perf: 7% of the time re-creating sheet name strings.
No need to create cached versions of stringified sheet tokens for
a given grammar at great for every formula that we compile; defer
until use. Is this a large cost on save ?
Change-Id: I8058ed564dbdc00ff45c02cb483c1a20a48af272
-rw-r--r-- | sc/inc/compiler.hxx | 4 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 25 | ||||
-rw-r--r-- | svl/source/numbers/zforfind.cxx | 1 |
3 files changed, 22 insertions, 8 deletions
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 527ad760dd09..8b5158c81b14 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -328,7 +328,9 @@ private: bool mbCloseBrackets; // whether to close open brackets automatically, default TRUE bool mbRewind; // whether symbol is to be rewound to some step during lexical analysis std::vector<sal_uInt16> maExternalFiles; - std::vector<OUString> maTabNames; + + std::vector<OUString> maTabNames; /// sheet names mangled for the current grammer for output + std::vector<OUString> &GetSetupTabNames() const; /// get or setup tab names for the current grammar bool NextNewToken(bool bInArray = false); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 751b98b2ceb6..6f6b89d134f1 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -228,14 +228,24 @@ void ScCompiler::SetGrammar( const FormulaGrammar::Grammar eGrammar ) if (eMyGrammar != GetGrammar()) SetGrammarAndRefConvention( eMyGrammar, eOldGrammar); } +} + +// Unclear how this was intended to be refreshed when the +// grammer or sheet count is changed ? Ideally this would be +// a method on Document that would globally cache these. +std::vector<OUString> &ScCompiler::GetSetupTabNames() const +{ + std::vector<OUString> &rTabNames = const_cast<ScCompiler *>(this)->maTabNames; - if (pDoc && maTabNames.empty()) + if (pDoc && rTabNames.empty()) { - maTabNames = pDoc->GetAllTableNames(); - std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end(); + rTabNames = pDoc->GetAllTableNames(); + std::vector<OUString>::iterator it = rTabNames.begin(), itEnd = rTabNames.end(); for (; it != itEnd; ++it) ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(meGrammar)); } + + return rTabNames; } void ScCompiler::SetNumberFormatter( SvNumberFormatter* pFormatter ) @@ -4207,17 +4217,20 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* else { rBuffer.append(ScGlobal::GetRscString(STR_NO_NAME_REF)); - pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, aRef, true); + pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, + GetSetupTabNames(), aRef, true); } } else - pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, aRef, true); + pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, + GetSetupTabNames(), aRef, true); } void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const { OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef); - pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, maTabNames, static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false); + pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, GetSetupTabNames(), + static_cast<ScToken*>(_pTokenP)->GetDoubleRef(), false); } void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const diff --git a/svl/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx index 038597043f30..cca342fda6c3 100644 --- a/svl/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -17,7 +17,6 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ - #include <ctype.h> #include <cstdlib> #include <float.h> |