[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