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()
 {

Reply via email to