Revision control
++ // Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff <milian.wolff@kdab.com>
++ // Copyright (C) 2019 Menlo Systems GmbH, author Arno Rehn <a.rehn@menlosystems.com>
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ #include "tst_bench_qwebchannel.h"
++
++ #include <QtTest/QtTest>
++
++ #include <QWebChannel>
++
++ #include <QtWebChannel/private/qmetaobjectpublisher_p.h>
++ #include <QtWebChannel/private/qwebchannel_p.h>
++
++ class tst_bench_QWebChannel : public QObject
++ {
++ Q_OBJECT
++ public:
++ tst_bench_QWebChannel(QObject *parent = nullptr);
++
++ private slots:
++ void benchClassInfo();
++ void benchInitializeClients();
++ void benchPropertyUpdates();
++ void benchRegisterObjects();
++ void benchRemoveTransport();
++
++ private:
++ DummyTransport *m_dummyTransport;
++ };
++
++ tst_bench_QWebChannel::tst_bench_QWebChannel(QObject *parent)
++ : QObject(parent),
++ m_dummyTransport(new DummyTransport(this))
++ {
++ }
++
++ static QHash<QString, QObject*> createObjects(QObject *parent)
++ {
++ const int num = 100;
++ QHash<QString, QObject*> objects;
++ objects.reserve(num);
++ for (int i = 0; i < num; ++i) {
++ objects[QStringLiteral("obj%1").arg(i)] = new BenchObject(parent);
++ }
++ return objects;
++ }
++
++ void tst_bench_QWebChannel::benchClassInfo()
++ {
++ QWebChannel channel;
++ channel.connectTo(m_dummyTransport);
++
++ QObject parent;
++ const QHash<QString, QObject*> objects = createObjects(&parent);
++ QMetaObjectPublisher *publisher = channel.d_func()->publisher;
++
++ QBENCHMARK {
++ for (const QObject *object : objects)
++ publisher->classInfoForObject(object, m_dummyTransport);
++ }
++ }
++
++ void tst_bench_QWebChannel::benchInitializeClients()
++ {
++ QWebChannel channel;
++ channel.connectTo(m_dummyTransport);
++
++ QObject parent;
++ channel.registerObjects(createObjects(&parent));
++
++ QMetaObjectPublisher *publisher = channel.d_func()->publisher;
++ QBENCHMARK {
++ publisher->initializeClient(m_dummyTransport);
++
++ publisher->propertyUpdatesInitialized = false;
++ publisher->signalToPropertyMap.clear();
++ publisher->signalHandlers.clear();
++ }
++ }
++
++ void tst_bench_QWebChannel::benchPropertyUpdates()
++ {
++ QWebChannel channel;
++ channel.connectTo(m_dummyTransport);
++
++ QObject parent;
++ const QHash<QString, QObject*> objects = createObjects(&parent);
++ QList<BenchObject *> objectList;
++ objectList.reserve(objects.size());
++ for (QObject *obj : objects)
++ objectList << qobject_cast<BenchObject*>(obj);
++
++ channel.registerObjects(objects);
++ channel.d_func()->publisher->initializeClient(m_dummyTransport);
++
++ QBENCHMARK {
++ for (BenchObject *obj : std::as_const(objectList))
++ obj->change();
++
++ channel.d_func()->publisher->setClientIsIdle(true, m_dummyTransport);
++ channel.d_func()->publisher->sendPendingPropertyUpdates();
++ }
++ }
++
++ void tst_bench_QWebChannel::benchRegisterObjects()
++ {
++ QWebChannel channel;
++ channel.connectTo(m_dummyTransport);
++
++ QObject parent;
++ const QHash<QString, QObject*> objects = createObjects(&parent);
++
++ QBENCHMARK {
++ channel.registerObjects(objects);
++ }
++ }
++
++ void tst_bench_QWebChannel::benchRemoveTransport()
++ {
++ QWebChannel channel;
++ std::vector<std::unique_ptr<DummyTransport>> dummyTransports(500);
++ for (auto &e : dummyTransports)
++ e = std::make_unique<DummyTransport>(this);
++
++ std::vector<std::unique_ptr<QObject>> objs;
++ QMetaObjectPublisher *pub = channel.d_func()->publisher;
++
++ for (auto &e : dummyTransports) {
++ DummyTransport *transport = e.get();
++ channel.connectTo(transport);
++ channel.d_func()->publisher->initializeClient(transport);
++
++ /* 30 objects per transport */
++ for (int i = 30; i > 0; i--) {
++ auto obj = std::make_unique<QObject>();
++ pub->wrapResult(QVariant::fromValue(obj.get()), transport);
++ objs.push_back(std::move(obj));
++ }
++ }
++
++ QBENCHMARK_ONCE {
++ for (auto &transport : dummyTransports)
++ pub->transportRemoved(transport.get());
++ }
++ }
++
++ QTEST_MAIN(tst_bench_QWebChannel)
++
++ #include "tst_bench_qwebchannel.moc"