From f1b74f7b58a6c7b9b458e76add55f62775777ce2 Mon Sep 17 00:00:00 2001 From: Anton Kudryavtsev Date: Tue, 19 Mar 2024 18:20:40 +0300 Subject: [PATCH] QHttpNetworkConnection: optimize startNextRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use QVLA instead of QQueue to avoid allocations and use QSpan to emulate queue behavior to avoid N^2 Change-Id: I333bc1af98a596fc041765996867a3d6449fcfde Reviewed-by: Edward Welbourne Reviewed-by: MÃ¥rten Nordheim --- src/network/access/qhttpnetworkconnection.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp index b8a49a926dc..ae5796de905 100644 --- a/src/network/access/qhttpnetworkconnection.cpp +++ b/src/network/access/qhttpnetworkconnection.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #ifndef QT_NO_SSL # include @@ -1134,7 +1136,7 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() if (neededOpenChannels <= 0) return; - QQueue channelsToConnect; + QVarLengthArray channelsToConnect; // use previously used channels first for (int i = 0; i < activeChannelCount && neededOpenChannels > 0; ++i) { @@ -1150,7 +1152,7 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() if (!channels[i].reply && !channels[i].isSocketBusy() && (channels[i].socket->state() == QAbstractSocket::UnconnectedState)) { - channelsToConnect.enqueue(i); + channelsToConnect.push_back(i); neededOpenChannels--; } } @@ -1160,12 +1162,14 @@ void QHttpNetworkConnectionPrivate::_q_startNextRequest() if (channels[i].socket) continue; - channelsToConnect.enqueue(i); + channelsToConnect.push_back(i); neededOpenChannels--; } - while (!channelsToConnect.isEmpty()) { - const int channel = channelsToConnect.dequeue(); + auto channelToConnectSpan = QSpan{channelsToConnect}; + while (!channelToConnectSpan.isEmpty()) { + const int channel = channelToConnectSpan.front(); + channelToConnectSpan = channelToConnectSpan.sliced(1); if (networkLayerState == IPv4) channels[channel].networkLayerPreference = QAbstractSocket::IPv4Protocol;