diff options
author | Milian Wolff <milian.wolff@kdab.com> | 2013-12-19 19:05:27 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-27 15:51:16 +0100 |
commit | a001534f832e58cc081512e12a4b7266489f2ad7 (patch) | |
tree | 6ecd99250088336a75028695957f267a512efb63 /src/webchannel/signalhandler_p.h | |
parent | 110890e091cd1f112b18196048f62efe7b858e19 (diff) | |
download | qtwebchannel-a001534f832e58cc081512e12a4b7266489f2ad7.tar.gz |
Optimize SignalHandler by obsoleting the call to senderSignalIndex.
This method is quite slow, and can be compared to two calls of sender().
We now encode the signal index in the methodId and thus do not have to
call it anymore. The performance gain is about 27% (9.2 vs. 12.7ms).
Change-Id: Iaa75efa27a54a21e27e62994de25cafd8136159d
Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'src/webchannel/signalhandler_p.h')
-rw-r--r-- | src/webchannel/signalhandler_p.h | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/src/webchannel/signalhandler_p.h b/src/webchannel/signalhandler_p.h index 7360028..28b3f49 100644 --- a/src/webchannel/signalhandler_p.h +++ b/src/webchannel/signalhandler_p.h @@ -158,8 +158,8 @@ void SignalHandler<Receiver>::connectTo(const QObject *object, const int signalI return; } // otherwise not yet connected, do so now - const int memberOffset = QObject::staticMetaObject.methodCount(); - QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset, Qt::DirectConnection, 0); + static const int memberOffset = QObject::staticMetaObject.methodCount(); + QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset + signalIndex, Qt::DirectConnection, 0); if (!connection) { qWarning() << "SignalHandler: QMetaObject::connect returned false. Unable to connect to" << object << signal.name() << signal.methodSignature(); return; @@ -244,25 +244,24 @@ int SignalHandler<Receiver>::qt_metacall(QMetaObject::Call call, int methodId, v return methodId; if (call == QMetaObject::InvokeMetaMethod) { - if (methodId == 0) { - const QObject *object = sender(); - Q_ASSERT(object); - const int signalIndex = senderSignalIndex(); - Q_ASSERT(signalIndex != -1); + const QObject *object = sender(); + Q_ASSERT(object); + Q_ASSERT(senderSignalIndex() == methodId); + Q_ASSERT(m_connectionsCounter.contains(object)); + Q_ASSERT(m_connectionsCounter.value(object).contains(methodId)); - dispatch(object, signalIndex, args); + dispatch(object, methodId, args); - if (signalIndex == s_destroyedSignalIndex) { - // disconnect on QObject::destroyed - ConnectionHash::iterator it = m_connectionsCounter.find(object); - Q_ASSERT(it != m_connectionsCounter.end()); - foreach (const ConnectionPair &connection, *it) { - QObject::disconnect(connection.first); - } - m_connectionsCounter.erase(it); + if (methodId == s_destroyedSignalIndex) { + // disconnect on QObject::destroyed + ConnectionHash::iterator it = m_connectionsCounter.find(object); + Q_ASSERT(it != m_connectionsCounter.end()); + foreach (const ConnectionPair &connection, *it) { + QObject::disconnect(connection.first); } + m_connectionsCounter.erase(it); } - --methodId; + return -1; } return methodId; } |