[Libreoffice-commits] core.git: Branch 'feature/perfwork' - 3 commits - sax/source sc/source

Matúš Kukan matus.kukan at collabora.com
Wed Oct 1 05:42:14 PDT 2014


 sax/source/tools/CachedOutputStream.hxx |   46 ++++-------------
 sax/source/tools/fastserializer.cxx     |    9 +--
 sc/source/core/tool/address.cxx         |   86 ++++++++++++++++----------------
 3 files changed, 60 insertions(+), 81 deletions(-)

New commits:
commit 077b5381570c5bea2281267ad1d2b3f5ab2beac6
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Tue Sep 30 15:13:22 2014 +0200

    Use OUStringBuffers for performance reasons.
    
    Saves 120m pcycles in just 250k calls to ScAddress::Format.
    
    Change-Id: Ibf20cf0843a47cf0fa37a38c4fecf1ae1560412c

diff --git a/sc/source/core/tool/address.cxx b/sc/source/core/tool/address.cxx
index 6a37952..c8c8f18 100644
--- a/sc/source/core/tool/address.cxx
+++ b/sc/source/core/tool/address.cxx
@@ -1656,50 +1656,50 @@ sal_uInt16 ScRange::ParseRows( const OUString& rStr, ScDocument* pDoc,
     return (p != NULL && *p == '\0') ? nRes : 0;
 }
 
-static inline void lcl_a1_append_c ( OUString &rString, int nCol, bool bIsAbs )
+static inline void lcl_a1_append_c ( OUStringBuffer &rString, int nCol, bool bIsAbs )
 {
     if( bIsAbs )
-        rString += "$";
+        rString.append("$");
     ScColToAlpha( rString, sal::static_int_cast<SCCOL>(nCol) );
 }
 
-static inline void lcl_a1_append_r ( OUString &rString, int nRow, bool bIsAbs )
+static inline void lcl_a1_append_r ( OUStringBuffer &rString, int nRow, bool bIsAbs )
 {
     if ( bIsAbs )
-        rString += "$";
-    rString += OUString::number( nRow+1 );
+        rString.append("$");
+    rString.append(OUString::number( nRow+1 ));
 }
 
-static inline void lcl_r1c1_append_c ( OUString &rString, int nCol, bool bIsAbs,
+static inline void lcl_r1c1_append_c ( OUStringBuffer &rString, int nCol, bool bIsAbs,
                                        const ScAddress::Details& rDetails )
 {
-    rString += "C";
+    rString.append("C");
     if (bIsAbs)
     {
-        rString += OUString::number( nCol + 1 );
+        rString.append(OUString::number( nCol + 1 ));
     }
     else
     {
         nCol -= rDetails.nCol;
         if (nCol != 0) {
-            rString += "[" + OUString::number( nCol ) + "]";
+            rString.append("[").append(OUString::number( nCol )).append("]");
         }
     }
 }
 
-static inline void lcl_r1c1_append_r ( OUString &rString, int nRow, bool bIsAbs,
+static inline void lcl_r1c1_append_r ( OUStringBuffer &rString, int nRow, bool bIsAbs,
                                        const ScAddress::Details& rDetails )
 {
-    rString += "R";
+    rString.append("R");
     if (bIsAbs)
     {
-        rString += OUString::number( nRow + 1 );
+        rString.append(OUString::number( nRow + 1 ));
     }
     else
     {
         nRow -= rDetails.nRow;
         if (nRow != 0) {
-            rString += "[" + OUString::number( nRow ) + "]";
+            rString.append("[").append(OUString::number( nRow )).append("]");
         }
     }
 }
@@ -1732,7 +1732,7 @@ static OUString getFileNameFromDoc( const ScDocument* pDoc )
 OUString ScAddress::Format(sal_uInt16 nFlags, const ScDocument* pDoc,
                            const Details& rDetails) const
 {
-    OUString r;
+    OUStringBuffer r;
     if( nFlags & SCA_VALID )
         nFlags |= ( SCA_VALID_ROW | SCA_VALID_COL | SCA_VALID_TAB );
     if( pDoc && (nFlags & SCA_VALID_TAB ) )
@@ -1770,11 +1770,11 @@ OUString ScAddress::Format(sal_uInt16 nFlags, const ScDocument* pDoc,
             {
             default :
             case formula::FormulaGrammar::CONV_OOO:
-                r += aDocName;
+                r.append(aDocName);
                 if( nFlags & SCA_TAB_ABSOLUTE )
-                    r += "$";
-                r += aTabName;
-                r += ".";
+                    r.append("$");
+                r.append(aTabName);
+                r.append(".");
                 break;
 
             case formula::FormulaGrammar::CONV_XL_A1:
@@ -1782,10 +1782,10 @@ OUString ScAddress::Format(sal_uInt16 nFlags, const ScDocument* pDoc,
             case formula::FormulaGrammar::CONV_XL_OOX:
                 if (!aDocName.isEmpty())
                 {
-                    r += "[" + aDocName + "]";
+                    r.append("[").append(aDocName).append("]");
                 }
-                r += aTabName;
-                r += "!";
+                r.append(aTabName);
+                r.append("!");
                 break;
             }
         }
@@ -1809,7 +1809,7 @@ OUString ScAddress::Format(sal_uInt16 nFlags, const ScDocument* pDoc,
             lcl_r1c1_append_c ( r, nCol, (nFlags & SCA_COL_ABSOLUTE) != 0, rDetails );
         break;
     }
-    return r;
+    return r.makeStringAndClear();
 }
 
 static void lcl_Split_DocTab( const ScDocument* pDoc,  SCTAB nTab,
@@ -1841,7 +1841,7 @@ static void lcl_Split_DocTab( const ScDocument* pDoc,  SCTAB nTab,
     ScCompiler::CheckTabQuotes( rTabName, rDetails.eConv);
 }
 
-static void lcl_ScRange_Format_XL_Header( OUString& rString, const ScRange& rRange,
+static void lcl_ScRange_Format_XL_Header( OUStringBuffer& rString, const ScRange& rRange,
                                           sal_uInt16 nFlags, const ScDocument* pDoc,
                                           const ScAddress::Details& rDetails )
 {
@@ -1852,18 +1852,18 @@ static void lcl_ScRange_Format_XL_Header( OUString& rString, const ScRange& rRan
                           aTabName, aDocName );
         if( !aDocName.isEmpty() )
         {
-            rString += "[" + aDocName + "]";
+            rString.append("[").append(aDocName).append("]");
         }
-        rString += aTabName;
+        rString.append(aTabName);
 
         if( nFlags & SCA_TAB2_3D )
         {
             lcl_Split_DocTab( pDoc, rRange.aEnd.Tab(), rDetails, nFlags,
                               aTabName, aDocName );
-            rString += ":";
-            rString += aTabName;
+            rString.append(":");
+            rString.append(aTabName);
         }
-        rString += "!";
+        rString.append("!");
     }
 }
 
@@ -1875,7 +1875,7 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
         return ScGlobal::GetRscString( STR_NOREF_STR );
     }
 
-    OUString r;
+    OUStringBuffer r;
 #define absrel_differ(nFlags, mask) (((nFlags) & (mask)) ^ (((nFlags) >> 4) & (mask)))
     switch( rDetails.eConv ) {
     default :
@@ -1894,8 +1894,8 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
             else
                 nFlags |= SCA_TAB_3D;
             OUString aName(aEnd.Format(nFlags, pDoc, rDetails));
-            r += ":";
-            r += aName;
+            r.append(":");
+            r.append(aName);
         }
     }
     break;
@@ -1907,14 +1907,14 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
         {
             // Full col refs always require 2 rows (2:2)
             lcl_a1_append_r( r, aStart.Row(), (nFlags & SCA_ROW_ABSOLUTE) != 0 );
-            r += ":";
+            r.append(":");
             lcl_a1_append_r( r, aEnd.Row(), (nFlags & SCA_ROW2_ABSOLUTE) != 0 );
         }
         else if( aStart.Row() == 0 && aEnd.Row() >= MAXROW )
         {
             // Full row refs always require 2 cols (A:A)
             lcl_a1_append_c( r, aStart.Col(), (nFlags & SCA_COL_ABSOLUTE) != 0 );
-            r += ":";
+            r.append(":");
             lcl_a1_append_c( r, aEnd.Col(), (nFlags & SCA_COL2_ABSOLUTE) != 0 );
         }
         else
@@ -1925,7 +1925,7 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
                 absrel_differ( nFlags, SCA_COL_ABSOLUTE ) ||
                 aStart.Row() != aEnd.Row() ||
                 absrel_differ( nFlags, SCA_ROW_ABSOLUTE )) {
-                r += ":";
+                r.append(":");
                 lcl_a1_append_c ( r, aEnd.Col(), (nFlags & SCA_COL2_ABSOLUTE) != 0 );
                 lcl_a1_append_r ( r, aEnd.Row(), (nFlags & SCA_ROW2_ABSOLUTE) != 0 );
             }
@@ -1939,7 +1939,7 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
             lcl_r1c1_append_r( r, aStart.Row(), (nFlags & SCA_ROW_ABSOLUTE) != 0, rDetails );
             if( aStart.Row() != aEnd.Row() ||
                 absrel_differ( nFlags, SCA_ROW_ABSOLUTE )) {
-                r += ":";
+                r.append(":");
                 lcl_r1c1_append_r( r, aEnd.Row(), (nFlags & SCA_ROW2_ABSOLUTE) != 0, rDetails );
             }
         }
@@ -1948,7 +1948,7 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
             lcl_r1c1_append_c( r, aStart.Col(), (nFlags & SCA_COL_ABSOLUTE) != 0, rDetails );
             if( aStart.Col() != aEnd.Col() ||
                 absrel_differ( nFlags, SCA_COL_ABSOLUTE )) {
-                r += ":";
+                r.append(":");
                 lcl_r1c1_append_c( r, aEnd.Col(), (nFlags & SCA_COL2_ABSOLUTE) != 0, rDetails );
             }
         }
@@ -1960,14 +1960,14 @@ OUString ScRange::Format( sal_uInt16 nFlags, const ScDocument* pDoc,
                 absrel_differ( nFlags, SCA_COL_ABSOLUTE ) ||
                 aStart.Row() != aEnd.Row() ||
                 absrel_differ( nFlags, SCA_ROW_ABSOLUTE )) {
-                r += ":";
+                r.append(":");
                 lcl_r1c1_append_r( r, aEnd.Row(), (nFlags & SCA_ROW2_ABSOLUTE) != 0, rDetails );
                 lcl_r1c1_append_c( r, aEnd.Col(), (nFlags & SCA_COL2_ABSOLUTE) != 0, rDetails );
             }
         }
     }
 #undef  absrel_differ
-    return r;
+    return r.makeStringAndClear();
 }
 
 bool ScAddress::Move( SCsCOL dx, SCsROW dy, SCsTAB dz, ScDocument* pDoc )
@@ -2003,7 +2003,7 @@ bool ScRange::Move( SCsCOL dx, SCsROW dy, SCsTAB dz, ScDocument* pDoc )
 OUString ScAddress::GetColRowString( bool bAbsolute,
                                    const Details& rDetails ) const
 {
-    OUString aString;
+    OUStringBuffer aString;
 
     switch( rDetails.eConv )
     {
@@ -2012,14 +2012,14 @@ OUString ScAddress::GetColRowString( bool bAbsolute,
     case formula::FormulaGrammar::CONV_XL_A1:
     case formula::FormulaGrammar::CONV_XL_OOX:
     if (bAbsolute)
-        aString += "$";
+        aString.append("$");
 
     ScColToAlpha( aString, nCol);
 
     if ( bAbsolute )
-        aString += "$";
+        aString.append("$");
 
-    aString += OUString::number(nRow+1);
+    aString.append(OUString::number(nRow+1));
         break;
 
     case formula::FormulaGrammar::CONV_XL_R1C1:
@@ -2028,7 +2028,7 @@ OUString ScAddress::GetColRowString( bool bAbsolute,
         break;
     }
 
-    return aString;
+    return aString.makeStringAndClear();
 }
 
 OUString ScRefAddress::GetRefString( ScDocument* pDoc, SCTAB nActTab,
commit 16ae4e0ac5d0a9481e9bd03315b2c40ca1234a37
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Tue Sep 30 13:53:26 2014 +0200

    FastSerializer: Simplify cache to be fixed sized buffer
    
    This makes writeBytes(), which is called a lot, simpler and thus faster.
    E.g. for ~15m calls, this saves ~110m pcycles.
    
    Change-Id: I29d01a1a8651f668aff574e0f015cd2f018eb1cd

diff --git a/sax/source/tools/CachedOutputStream.hxx b/sax/source/tools/CachedOutputStream.hxx
index 56b17fb..82c2b66 100644
--- a/sax/source/tools/CachedOutputStream.hxx
+++ b/sax/source/tools/CachedOutputStream.hxx
@@ -22,28 +22,17 @@ namespace sax_fastparser {
 
 class CachedOutputStream
 {
-    /// realloc aligns to this value
-    static const sal_Int32 mnMinimumResize = 0x1000;
     /// When buffer hits this size, it's written to mxOutputStream
     static const sal_Int32 mnMaximumSize = 0x10000;
 
     /// Output stream, usually writing data into files.
     css::uno::Reference< css::io::XOutputStream > mxOutputStream;
-    sal_Int32 mnCacheAllocatedSize;
     sal_Int32 mnCacheWrittenSize;
-    sal_Int8* mpCache;
+    sal_Int8 mpCache[ mnMaximumSize ];
 
 public:
-    CachedOutputStream() : mnCacheAllocatedSize(mnMinimumResize)
-                         , mnCacheWrittenSize(0)
-    {
-        mpCache = static_cast<sal_Int8 *>(malloc(mnCacheAllocatedSize));
-    }
-
-    ~CachedOutputStream()
-    {
-        free(mpCache);
-    }
+    CachedOutputStream() : mnCacheWrittenSize(0) {}
+    ~CachedOutputStream() {}
 
     css::uno::Reference< css::io::XOutputStream > getOutputStream() const
     {
@@ -58,30 +47,21 @@ public:
     /// cache string and if limit is hit, flush
     void writeBytes( const sal_Int8* pStr, sal_Int32 nLen )
     {
-        // Writer does some elements sorting, so it can accumulate
-        // pretty big strings in FastSaxSerializer::ForMerge.
-        // In that case, just flush data and write immediately.
-        if (nLen > mnMaximumSize)
-        {
-            flush();
-            mxOutputStream->writeBytes( css::uno::Sequence<sal_Int8>(pStr, nLen) );
-            return;
-        }
-
         // Write when the buffer gets big enough
         if (mnCacheWrittenSize + nLen > mnMaximumSize)
+        {
             flush();
 
-        sal_Int32 nMissingBytes = mnCacheWrittenSize + nLen - mnCacheAllocatedSize;
-        // Ensure the buffer has enough space left
-        if (nMissingBytes > 0)
-        {
-            // Round off to the next multiple of mnMinimumResize
-            mnCacheAllocatedSize = mnCacheAllocatedSize +
-                ((nMissingBytes + mnMinimumResize - 1) / mnMinimumResize) * mnMinimumResize;
-            mpCache = static_cast<sal_Int8 *>(realloc(mpCache, mnCacheAllocatedSize));
+            // Writer does some elements sorting, so it can accumulate
+            // pretty big strings in FastSaxSerializer::ForMerge.
+            // In that case, just flush data and write immediately.
+            if (nLen > mnMaximumSize)
+            {
+                mxOutputStream->writeBytes( css::uno::Sequence<sal_Int8>(pStr, nLen) );
+                return;
+            }
         }
-        assert(mnCacheWrittenSize + nLen <= mnCacheAllocatedSize);
+
         memcpy(mpCache + mnCacheWrittenSize, pStr, nLen);
         mnCacheWrittenSize += nLen;
     }
commit caadeb50951f94654bc42cc0bb9a59f3dc8e72cf
Author: Matúš Kukan <matus.kukan at collabora.com>
Date:   Tue Sep 30 13:40:06 2014 +0200

    This was OString already; use it that way
    
    Change-Id: Ia2268ce8a1e2111adb609c515e5bfa824afa66ce

diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx
index 02c97e6..87c317c 100644
--- a/sax/source/tools/fastserializer.cxx
+++ b/sax/source/tools/fastserializer.cxx
@@ -210,7 +210,7 @@ namespace sax_fastparser {
     void FastSaxSerializer::writeFastAttributeList( FastAttributeList* pAttrList )
     {
 #ifdef DBG_UTIL
-        ::std::set<OUString> DebugAttributes;
+        ::std::set<OString> DebugAttributes;
 #endif
         const std::vector< sal_Int32 >& Tokens = pAttrList->getFastAttributeTokens();
         for (size_t j = 0; j < Tokens.size(); j++)
@@ -222,10 +222,9 @@ namespace sax_fastparser {
 
 #ifdef DBG_UTIL
             // Well-formedness constraint: Unique Att Spec
-            OUString const name(OStringToOUString(getId(nToken),
-                                                  RTL_TEXTENCODING_UTF8));
-            assert(DebugAttributes.find(name) == DebugAttributes.end());
-            DebugAttributes.insert(name);
+            OString const nameId(getId(nToken));
+            assert(DebugAttributes.find(nameId) == DebugAttributes.end());
+            DebugAttributes.insert(nameId);
 #endif
 
             writeBytes(sEqualSignAndQuote, N_CHARS(sEqualSignAndQuote));


More information about the Libreoffice-commits mailing list