From 99886a87c16078da0f3fb6a6e8387fee17318a7e Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Mon, 10 Jun 2019 22:52:51 +0300 Subject: 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 --- src/mqtt/qmqttconnection.cpp | 35 ++++++++++++++++++++++------------- 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(&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(&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 -#include +#include #include #include #include @@ -147,11 +147,11 @@ private: QMqttControlPacket::PacketType m_currentPacket{QMqttControlPacket::UNKNOWN}; bool writePacketToTransport(const QMqttControlPacket &p); - QMap m_pendingSubscriptionAck; - QMap m_pendingUnsubscriptions; - QMap m_activeSubscriptions; - QMap> m_pendingMessages; - QMap> m_pendingReleaseMessages; + QHash m_pendingSubscriptionAck; + QHash m_pendingUnsubscriptions; + QHash m_activeSubscriptions; + QHash> m_pendingMessages; + QHash> m_pendingReleaseMessages; InternalConnectionState m_internalState{BrokerDisconnected}; QTimer m_pingTimer; -- cgit v1.2.3