diff options
author | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2016-03-03 11:25:27 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@theqtcompany.com> | 2016-03-11 09:18:58 +0000 |
commit | 9ca9de7cbc8b045c19899987d6666576399af33d (patch) | |
tree | 43edf7e25ffb0fba2578db47bf5c0175fea76ced | |
parent | d87572053a15474a577dcf5714187fbdb4cfec0d (diff) |
QmlDebug: Support sending multiple messages per packet
This reduces the overhead caused by the prepending of service names to
packets. When running the planets example from qtcanvas3d through
qmlprofiler the average message length, without service name, is 26
bytes. The average full packet, with name and length, is 64 bytes long.
In fact, the time between stopping the application and the last message
arriving in the profiling client is reduced by 30-50% with this
change.
Change-Id: I0ffdd0483d45bbe8b092c59a9dcd63c6dc59119c
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
-rw-r--r-- | src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp | 31 | ||||
-rw-r--r-- | src/qmldebug/qqmldebugconnection.cpp | 13 |
2 files changed, 32 insertions, 12 deletions
diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp index a5f9ed9a1a..7c18f0c38a 100644 --- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp +++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp @@ -186,6 +186,7 @@ private: QStringList m_clientPlugins; bool m_gotHello; bool m_blockingMode; + bool m_clientSupportsMultiPackets; QHash<QJSEngine *, EngineCondition> m_engineConditions; @@ -274,7 +275,8 @@ static void cleanupOnShutdown() QQmlDebugServerImpl::QQmlDebugServerImpl() : m_connection(0), m_gotHello(false), - m_blockingMode(false) + m_blockingMode(false), + m_clientSupportsMultiPackets(false) { static bool postRoutineAdded = false; if (!postRoutineAdded) { @@ -456,6 +458,11 @@ void QQmlDebugServerImpl::receiveMessage() s_dataStreamVersion = QDataStream::Qt_DefaultCompiledVersion; } + if (!in.atEnd()) + in >> m_clientSupportsMultiPackets; + else + m_clientSupportsMultiPackets = false; + // Send the hello answer immediately, since it needs to arrive before // the plugins below start sending messages. @@ -516,14 +523,16 @@ void QQmlDebugServerImpl::receiveMessage() } else { if (m_gotHello) { - QByteArray message; - in >> message; - QHash<QString, QQmlDebugService *>::Iterator iter = m_plugins.find(name); if (iter == m_plugins.end()) { qWarning() << "QML Debugger: Message received for missing plugin" << name << '.'; } else { - (*iter)->messageReceived(message); + QQmlDebugService *service = *iter; + QByteArray message; + while (!in.atEnd()) { + in >> message; + service->messageReceived(message); + } } } else { qWarning("QML Debugger: Invalid hello message."); @@ -686,8 +695,16 @@ void QQmlDebugServerImpl::sendMessage(const QString &name, const QByteArray &mes void QQmlDebugServerImpl::sendMessages(const QString &name, const QList<QByteArray> &messages) { if (canSendMessage(name)) { - foreach (const QByteArray &message, messages) - doSendMessage(name, message); + if (m_clientSupportsMultiPackets) { + QQmlDebugPacket out; + out << name; + foreach (const QByteArray &message, messages) + out << message; + m_protocol->send(out.data()); + } else { + foreach (const QByteArray &message, messages) + doSendMessage(name, message); + } m_connection->flush(); } } diff --git a/src/qmldebug/qqmldebugconnection.cpp b/src/qmldebug/qqmldebugconnection.cpp index 37b66889cd..35a540bff8 100644 --- a/src/qmldebug/qqmldebugconnection.cpp +++ b/src/qmldebug/qqmldebugconnection.cpp @@ -106,7 +106,8 @@ void QQmlDebugConnection::socketConnected() { Q_D(QQmlDebugConnection); QPacket pack(d->currentDataStreamVersion); - pack << serverId << 0 << protocolVersion << d->plugins.keys() << d->maximumDataStreamVersion; + pack << serverId << 0 << protocolVersion << d->plugins.keys() << d->maximumDataStreamVersion + << true; // We accept multiple messages per packet d->protocol->send(pack.data()); d->flush(); } @@ -221,9 +222,6 @@ void QQmlDebugConnection::protocolReadyRead() qWarning() << "QQmlDebugConnection: Unknown control message id" << op; } } else { - QByteArray message; - pack >> message; - QHash<QString, QQmlDebugClient *>::Iterator iter = d->plugins.find(name); if (iter == d->plugins.end()) { // We can get more messages for plugins we have removed because it takes time to @@ -232,7 +230,12 @@ void QQmlDebugConnection::protocolReadyRead() qWarning() << "QQmlDebugConnection: Message received for missing plugin" << name; } else { - (*iter)->messageReceived(message); + QQmlDebugClient *client = *iter; + QByteArray message; + while (!pack.atEnd()) { + pack >> message; + client->messageReceived(message); + } } } } |