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.ku...@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.ku...@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.ku...@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));
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits