diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2019-06-10 22:52:51 +0300 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2019-06-28 17:05:45 +0300 |
commit | 99886a87c16078da0f3fb6a6e8387fee17318a7e (patch) | |
tree | 05edcb0b37e1e7d72b21207eff9e0bf855642c35 | |
parent | 2d2a226a9e09a7faa73352febd7bd8e33c0c50a7 (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.cpp | 35 | ||||
-rw-r--r-- | src/mqtt/qmqttconnection_p.h | 12 |
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; |