summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2019-06-10 22:52:51 +0300
committerKonstantin Ritt <ritt.ks@gmail.com>2019-06-28 17:05:45 +0300
commit99886a87c16078da0f3fb6a6e8387fee17318a7e (patch)
tree05edcb0b37e1e7d72b21207eff9e0bf855642c35
parent2d2a226a9e09a7faa73352febd7bd8e33c0c50a7 (diff)
Prefer QHash over QMap for faster key lookup
amortized O(1) for QHash VS. stable O(log n) for QMap + optimize usage cases by decreasing the amount of key lookups Change-Id: I169b2d97f07854ce5aca030321820a866d0038ed Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/mqtt/qmqttconnection.cpp35
-rw-r--r--src/mqtt/qmqttconnection_p.h12
2 files changed, 28 insertions, 19 deletions
diff --git a/src/mqtt/qmqttconnection.cpp b/src/mqtt/qmqttconnection.cpp
index 61a6ef0..bbad0bd 100644
--- a/src/mqtt/qmqttconnection.cpp
+++ b/src/mqtt/qmqttconnection.cpp
@@ -466,15 +466,22 @@ QMqttSubscription *QMqttConnection::sendControlSubscribe(const QMqttTopicFilter
qCDebug(lcMqttConnection) << Q_FUNC_INFO << " Topic:" << topic << " qos:" << qos;
if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0) {
- if (!topic.sharedSubscriptionName().isEmpty()) {
+ const QString sharedSubscriptionName = topic.sharedSubscriptionName();
+ if (!sharedSubscriptionName.isEmpty()) {
const QMqttTopicFilter filter(topic.filter().section(QLatin1Char('/'), 2));
- if (m_activeSubscriptions.contains(filter)
- && m_activeSubscriptions.value(filter)->sharedSubscriptionName() == topic.sharedSubscriptionName())
- return m_activeSubscriptions[filter];
- } else if (m_activeSubscriptions.contains(topic) && !m_activeSubscriptions.value(topic)->isSharedSubscription())
- return m_activeSubscriptions[topic];
- } else if (m_activeSubscriptions.contains(topic))
- return m_activeSubscriptions[topic];
+ auto it = m_activeSubscriptions.constFind(filter);
+ if (it != m_activeSubscriptions.cend() && (*it)->sharedSubscriptionName() == sharedSubscriptionName)
+ return *it;
+ } else {
+ auto it = m_activeSubscriptions.constFind(topic);
+ if (it != m_activeSubscriptions.cend() && !(*it)->isSharedSubscription())
+ return *it;
+ }
+ } else {
+ auto it = m_activeSubscriptions.constFind(topic);
+ if (it != m_activeSubscriptions.cend())
+ return *it;
+ }
// has to have 0010 as bits 3-0, maybe update SUBSCRIBE instead?
// MQTT-3.8.1-1
@@ -1451,13 +1458,13 @@ void QMqttConnection::finalize_connack()
void QMqttConnection::finalize_suback()
{
const quint16 id = readBufferTyped<quint16>(&m_missingData);
- if (!m_pendingSubscriptionAck.contains(id)) {
+
+ auto sub = m_pendingSubscriptionAck.take(id);
+ if (Q_UNLIKELY(sub == nullptr)) {
qCDebug(lcMqttConnection) << "Received SUBACK for unknown subscription request.";
return;
}
- auto sub = m_pendingSubscriptionAck.take(id);
-
if (m_clientPrivate->m_protocolVersion == QMqttClient::MQTT_5_0)
readSubscriptionProperties(sub);
@@ -1485,11 +1492,13 @@ void QMqttConnection::finalize_unsuback()
{
const quint16 id = readBufferTyped<quint16>(&m_missingData);
qCDebug(lcMqttConnectionVerbose) << "Finalize UNSUBACK: " << id;
- if (!m_pendingUnsubscriptions.contains(id)) {
+
+ auto sub = m_pendingUnsubscriptions.take(id);
+ if (Q_UNLIKELY(sub == nullptr)) {
qCDebug(lcMqttConnection) << "Received UNSUBACK for unknown request.";
return;
}
- auto sub = m_pendingUnsubscriptions.take(id);
+
sub->setState(QMqttSubscription::Unsubscribed);
m_activeSubscriptions.remove(sub->topic());
}
diff --git a/src/mqtt/qmqttconnection_p.h b/src/mqtt/qmqttconnection_p.h
index 84dc875..e8ecfde 100644
--- a/src/mqtt/qmqttconnection_p.h
+++ b/src/mqtt/qmqttconnection_p.h
@@ -46,7 +46,7 @@
#include "qmqttmessage.h"
#include "qmqttsubscription.h"
#include <QtCore/QBuffer>
-#include <QtCore/QMap>
+#include <QtCore/QHash>
#include <QtCore/QObject>
#include <QtCore/QSharedPointer>
#include <QtCore/QTimer>
@@ -147,11 +147,11 @@ private:
QMqttControlPacket::PacketType m_currentPacket{QMqttControlPacket::UNKNOWN};
bool writePacketToTransport(const QMqttControlPacket &p);
- QMap<quint16, QMqttSubscription *> m_pendingSubscriptionAck;
- QMap<quint16, QMqttSubscription *> m_pendingUnsubscriptions;
- QMap<QMqttTopicFilter, QMqttSubscription *> m_activeSubscriptions;
- QMap<quint16, QSharedPointer<QMqttControlPacket>> m_pendingMessages;
- QMap<quint16, QSharedPointer<QMqttControlPacket>> m_pendingReleaseMessages;
+ QHash<quint16, QMqttSubscription *> m_pendingSubscriptionAck;
+ QHash<quint16, QMqttSubscription *> m_pendingUnsubscriptions;
+ QHash<QMqttTopicFilter, QMqttSubscription *> m_activeSubscriptions;
+ QHash<quint16, QSharedPointer<QMqttControlPacket>> m_pendingMessages;
+ QHash<quint16, QSharedPointer<QMqttControlPacket>> m_pendingReleaseMessages;
InternalConnectionState m_internalState{BrokerDisconnected};
QTimer m_pingTimer;