include/svl/sharedstring.hxx | 7 ++++--- sc/source/core/tool/interpr8.cxx | 18 +++++++++--------- svl/source/misc/sharedstring.cxx | 1 + 3 files changed, 14 insertions(+), 12 deletions(-)
New commits: commit b392d0a25e229f305497ab5f9f084b71b24cc387 Author: Noel Grandin <noel.gran...@collabora.co.uk> AuthorDate: Thu Sep 1 16:03:10 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Fri Sep 2 11:56:45 2022 +0200 tdf#150712 reduce cost of SharedString::getString where the construction of empty strings is significant here which required fixing a couple of places that ended up using a reference to a temporary. Change-Id: I52feb1673bd39db4060585ac8d9ae2f3dea27fc6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139210 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/svl/sharedstring.hxx b/include/svl/sharedstring.hxx index 5b5c35b95a92..d84b5a16a2c9 100644 --- a/include/svl/sharedstring.hxx +++ b/include/svl/sharedstring.hxx @@ -22,6 +22,7 @@ class SVL_DLLPUBLIC SharedString public: static const SharedString & getEmptyString(); + static const OUString EMPTY_STRING; SharedString(); SharedString( rtl_uString* pData, rtl_uString* pDataIgnoreCase ); @@ -36,7 +37,7 @@ public: bool operator== ( const SharedString& r ) const; bool operator!= ( const SharedString& r ) const; - OUString getString() const; + const OUString & getString() const; rtl_uString* getData(); const rtl_uString* getData() const; @@ -111,9 +112,9 @@ inline bool SharedString::operator!= ( const SharedString& r ) const return !operator== (r); } -inline OUString SharedString::getString() const +inline const OUString & SharedString::getString() const { - return mpData ? OUString(mpData) : OUString(); + return mpData ? OUString::unacquired(&mpData) : EMPTY_STRING; } inline rtl_uString* SharedString::getData() diff --git a/sc/source/core/tool/interpr8.cxx b/sc/source/core/tool/interpr8.cxx index df75c92d41f1..8d3f7c25f489 100644 --- a/sc/source/core/tool/interpr8.cxx +++ b/sc/source/core/tool/interpr8.cxx @@ -1395,9 +1395,9 @@ void ScInterpreter::ScConcat_MS() case svString: case svDouble: { - const OUString& rStr = GetString().getString(); - if (CheckStringResultLen(aResBuf, rStr.getLength())) - aResBuf.append( rStr); + OUString aStr = GetString().getString(); + if (CheckStringResultLen(aResBuf, aStr.getLength())) + aResBuf.append(aStr); } break; case svSingleRef : @@ -1476,17 +1476,17 @@ void ScInterpreter::ScConcat_MS() { if ( pMat->IsStringOrEmpty( j, k ) ) { - const OUString& rStr = pMat->GetString( j, k ).getString(); - if (CheckStringResultLen(aResBuf, rStr.getLength())) - aResBuf.append( rStr); + OUString aStr = pMat->GetString( j, k ).getString(); + if (CheckStringResultLen(aResBuf, aStr.getLength())) + aResBuf.append(aStr); } else { if ( pMat->IsValue( j, k ) ) { - const OUString& rStr = pMat->GetString( *pFormatter, j, k ).getString(); - if (CheckStringResultLen(aResBuf, rStr.getLength())) - aResBuf.append( rStr); + OUString aStr = pMat->GetString( *pFormatter, j, k ).getString(); + if (CheckStringResultLen(aResBuf, aStr.getLength())) + aResBuf.append(aStr); } } } diff --git a/svl/source/misc/sharedstring.cxx b/svl/source/misc/sharedstring.cxx index 1bb05c6ace50..71f3354eca51 100644 --- a/svl/source/misc/sharedstring.cxx +++ b/svl/source/misc/sharedstring.cxx @@ -14,6 +14,7 @@ namespace svl { /** ref-counting traffic associated with SharedString temporaries can be significant, so use a singleton here, so we can return a const& from getEmptyString */ static OUString EMPTY(u""); const SharedString EMPTY_SHARED_STRING(EMPTY.pData, EMPTY.pData); +const OUString SharedString::EMPTY_STRING {}; const SharedString & SharedString::getEmptyString() {