summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qtextstream.cpp
diff options
context:
space:
mode:
authorDavid Faure <david.faure@kdab.com>2014-09-07 01:18:22 +0200
committerDavid Faure <david.faure@kdab.com>2014-09-12 02:07:36 +0200
commit31c6d9f04ba80e6776ae01cb0588e6bd228f7184 (patch)
tree57d9af62890d4d3d922527251226e7c512777d69 /src/corelib/io/qtextstream.cpp
parent66008040793f7e98f9cacd13271119b6b096d8bc (diff)
QTextStream: add fast path for writing char and QChar.
Avoids allocating a QString for every char being written out. The benchmark went from 5.5 ms per iteration to 0.8 ms, and from 40 million instructions to 6 million. Found using Milian Wolff's heaptrack tool. Change-Id: I1784c47b944454bc947a607a22c39d249372ed55 Reviewed-by: Adam Majer <adamm@zombino.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'src/corelib/io/qtextstream.cpp')
-rw-r--r--src/corelib/io/qtextstream.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp
index 4002ce8694..ab2bf98d15 100644
--- a/src/corelib/io/qtextstream.cpp
+++ b/src/corelib/io/qtextstream.cpp
@@ -835,6 +835,21 @@ inline void QTextStreamPrivate::write(const QString &data)
/*!
\internal
*/
+inline void QTextStreamPrivate::write(QChar ch)
+{
+ if (string) {
+ // ### What about seek()??
+ string->append(ch);
+ } else {
+ writeBuffer += ch;
+ if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE)
+ flushWriteBuffer();
+ }
+}
+
+/*!
+ \internal
+*/
inline bool QTextStreamPrivate::getChar(QChar *ch)
{
if ((string && stringOffset == string->size())
@@ -873,6 +888,17 @@ inline void QTextStreamPrivate::ungetChar(QChar ch)
/*!
\internal
*/
+inline void QTextStreamPrivate::putChar(QChar ch)
+{
+ if (params.fieldWidth > 0)
+ putString(QString(ch));
+ else
+ write(ch);
+}
+
+/*!
+ \internal
+*/
inline void QTextStreamPrivate::putString(const QString &s, bool number)
{
QString tmp = s;
@@ -2240,7 +2266,7 @@ QTextStream &QTextStream::operator<<(QChar c)
{
Q_D(QTextStream);
CHECK_VALID_STREAM(*this);
- d->putString(QString(c));
+ d->putChar(c);
return *this;
}
@@ -2253,7 +2279,7 @@ QTextStream &QTextStream::operator<<(char c)
{
Q_D(QTextStream);
CHECK_VALID_STREAM(*this);
- d->putString(QString(QChar::fromLatin1(c)));
+ d->putChar(QChar::fromLatin1(c));
return *this;
}