summaryrefslogtreecommitdiffstats
path: root/src/corelib/serialization/qdatastream.cpp
diff options
context:
space:
mode:
authorIvan Solovev <ivan.solovev@qt.io>2024-02-01 11:50:25 +0100
committerIvan Solovev <ivan.solovev@qt.io>2024-02-07 15:02:19 +0100
commita1bfac287ee5d3719646d68dc91dc8e8e4cec04e (patch)
treef2324565be8b6d787645d319268408a10caa4a64 /src/corelib/serialization/qdatastream.cpp
parentdd514160ce169734e23a146a2c115fed55a69260 (diff)
QDataStream::readBytes(): make the growth of the buffer geometric
The algorithm tries to allocate the memory using 1 Mb blocks. When the input data is large, this results in a lot of reallocations, which is slow and inefficient. This patch modifies the algorithm in such way that the allocation size increases at each step, resulting in geometric growth of the buffer. Pick-to: 6.7 6.6 6.5 Change-Id: I071df68d51ba1dbd8b2eb5f94eb078a33223505f Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/serialization/qdatastream.cpp')
-rw-r--r--src/corelib/serialization/qdatastream.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index d0421f70fad..32f827c69e7 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -1074,13 +1074,13 @@ QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
return *this;
}
- constexpr qsizetype Step = 1024 * 1024;
+ qsizetype step = 1024 * 1024;
qsizetype allocated = 0;
char *prevBuf = nullptr;
char *curBuf = nullptr;
do {
- qsizetype blockSize = qMin(Step, len - allocated);
+ qsizetype blockSize = qMin(step, len - allocated);
prevBuf = curBuf;
curBuf = new char[allocated + blockSize + 1];
if (prevBuf) {
@@ -1092,6 +1092,7 @@ QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
return *this;
}
allocated += blockSize;
+ step *= 2;
} while (allocated < len);
s = curBuf;