Avoid unnecessary memory allocation/relocation

This commit is contained in:
Chocobo1 2023-06-21 12:46:15 +08:00
parent 1f2a6455b6
commit 03d3552ee0
No known key found for this signature in database
GPG key ID: 210D9C873253A68C
3 changed files with 19 additions and 4 deletions

View file

@ -46,6 +46,10 @@ Connection::Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObj
{ {
m_socket->setParent(this); m_socket->setParent(this);
// reserve common size for requests, don't use the max allowed size which is too big for
// memory constrained platforms
m_receivedData.reserve(1024 * 1024);
// reset timer when there are activity // reset timer when there are activity
m_idleTimer.start(); m_idleTimer.start();
connect(m_socket, &QIODevice::readyRead, this, [this]() connect(m_socket, &QIODevice::readyRead, this, [this]()
@ -66,7 +70,18 @@ Connection::~Connection()
void Connection::read() void Connection::read()
{ {
m_receivedData.append(m_socket->readAll()); // reuse existing buffer and avoid unnecessary memory allocation/relocation
const qsizetype previousSize = m_receivedData.size();
const qint64 bytesAvailable = m_socket->bytesAvailable();
m_receivedData.resize(previousSize + bytesAvailable);
const qint64 bytesRead = m_socket->read((m_receivedData.data() + previousSize), bytesAvailable);
if (Q_UNLIKELY(bytesRead < 0))
{
m_socket->close();
return;
}
if (Q_UNLIKELY(bytesRead < bytesAvailable))
m_receivedData.chop(bytesAvailable - bytesRead);
while (!m_receivedData.isEmpty()) while (!m_receivedData.isEmpty())
{ {
@ -116,7 +131,7 @@ void Connection::read()
resp.headers[HEADER_CONNECTION] = u"keep-alive"_s; resp.headers[HEADER_CONNECTION] = u"keep-alive"_s;
sendResponse(resp); sendResponse(resp);
m_receivedData = m_receivedData.mid(result.frameSize); m_receivedData.remove(0, result.frameSize);
} }
break; break;

View file

@ -191,7 +191,7 @@ void Smtp::readyRead()
const int pos = m_buffer.indexOf("\r\n"); const int pos = m_buffer.indexOf("\r\n");
if (pos < 0) return; // Loop exit condition if (pos < 0) return; // Loop exit condition
const QByteArray line = m_buffer.left(pos); const QByteArray line = m_buffer.left(pos);
m_buffer = m_buffer.mid(pos + 2); m_buffer.remove(0, (pos + 2));
qDebug() << "Response line:" << line; qDebug() << "Response line:" << line;
// Extract response code // Extract response code
const QByteArray code = line.left(3); const QByteArray code = line.left(3);

View file

@ -318,7 +318,7 @@ void Path::stripRootFolder(PathList &filePaths)
return; return;
for (Path &filePath : filePaths) for (Path &filePath : filePaths)
filePath.m_pathStr = filePath.m_pathStr.mid(commonRootFolder.m_pathStr.size() + 1); filePath.m_pathStr.remove(0, (commonRootFolder.m_pathStr.size() + 1));
} }
void Path::addRootFolder(PathList &filePaths, const Path &rootFolder) void Path::addRootFolder(PathList &filePaths, const Path &rootFolder)