From fad19e18af7fd317a2f4e8daf537cbb46c63b8a7 Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 25 Nov 2011 19:00:01 +0100 Subject: Benchmark the new signal slot connection syntax. - Added emition of a slot connected using the new syntax, as well as a functor - Replaced the old connect_disconnect_benchmark by a new one. The old one was of little interest as it tried to connect to every signal, producing a lot of similar results. The new test tests different ways of connecting and disconnecting Change-Id: I3c04c24027252308f8942bcd9562110104cdb4e9 Reviewed-by: Bradley T. Hughes --- tests/benchmarks/corelib/kernel/qobject/main.cpp | 92 +++++++++++++++++++----- 1 file changed, 74 insertions(+), 18 deletions(-) diff --git a/tests/benchmarks/corelib/kernel/qobject/main.cpp b/tests/benchmarks/corelib/kernel/qobject/main.cpp index 7ca4144a19..13ba073eb4 100644 --- a/tests/benchmarks/corelib/kernel/qobject/main.cpp +++ b/tests/benchmarks/corelib/kernel/qobject/main.cpp @@ -63,6 +63,10 @@ private slots: void connect_disconnect_benchmark(); }; +struct Functor { + void operator()(){} +}; + void QObjectBenchmark::signal_slot_benchmark_data() { QTest::addColumn("type"); @@ -70,6 +74,8 @@ void QObjectBenchmark::signal_slot_benchmark_data() QTest::newRow("single signal/slot") << 1; QTest::newRow("multi signal/slot") << 2; QTest::newRow("unconnected signal") << 3; + QTest::newRow("single signal/ptr") << 4; + QTest::newRow("functor") << 5; } void QObjectBenchmark::signal_slot_benchmark() @@ -78,10 +84,17 @@ void QObjectBenchmark::signal_slot_benchmark() Object singleObject; Object multiObject; + Functor functor; singleObject.setObjectName("single"); multiObject.setObjectName("multi"); - singleObject.connect(&singleObject, SIGNAL(signal0()), SLOT(slot0())); + if (type == 5) { + QObject::connect(&singleObject, &Object::signal0, functor); + } else if (type == 4) { + QObject::connect(&singleObject, &Object::signal0, &singleObject, &Object::slot0); + } else { + singleObject.connect(&singleObject, SIGNAL(signal0()), SLOT(slot0())); + } multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(slot0())); // multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(signal1())); @@ -119,6 +132,10 @@ void QObjectBenchmark::signal_slot_benchmark() QBENCHMARK { singleObject.emitSignal1(); } + } else if (type == 4 || type == 5) { + QBENCHMARK { + singleObject.emitSignal0(); + } } } @@ -157,26 +174,65 @@ void QObjectBenchmark::dynamic_property_benchmark() void QObjectBenchmark::connect_disconnect_benchmark_data() { - QTest::addColumn("signal"); - const QMetaObject *mo = &QTreeView::staticMetaObject; - for (int i = 0; i < mo->methodCount(); ++i) { - QMetaMethod method = mo->method(i); - if (method.methodType() != QMetaMethod::Signal) - continue; - QByteArray sig = method.signature(); - QTest::newRow(sig) << sig; - } -} + QTest::addColumn("type"); + QTest::newRow("normalized signature") << 0; + QTest::newRow("unormalized signature") << 1; + QTest::newRow("function pointer") << 2; + QTest::newRow("normalized signature/handle") << 3; + QTest::newRow("unormalized signature/handle") << 4; + QTest::newRow("function pointer/handle") << 5; + QTest::newRow("functor/handle") << 6;} void QObjectBenchmark::connect_disconnect_benchmark() { - QFETCH(QByteArray, signal); - signal.prepend('2'); - const char *p = signal.constData(); - QTreeView obj; - QBENCHMARK { - QObject::connect(&obj, p, &obj, p); - QObject::disconnect(&obj, p, &obj, p); + QFETCH(int, type); + switch (type) { + case 0: { + QTreeView obj; + QBENCHMARK { + QObject::connect (&obj, SIGNAL(viewportEntered()), &obj, SLOT(expandAll())); + QObject::disconnect(&obj, SIGNAL(viewportEntered()), &obj, SLOT(expandAll())); + } + } break; + case 1: { + QTreeView obj; + QBENCHMARK { + QObject::connect (&obj, SIGNAL(viewportEntered( )), &obj, SLOT(expandAll( ))); + QObject::disconnect(&obj, SIGNAL(viewportEntered( )), &obj, SLOT(expandAll( ))); + } + } break; + case 2: { + QTreeView obj; + QBENCHMARK { + QObject::connect (&obj, &QAbstractItemView::viewportEntered, &obj, &QTreeView::expandAll); + QObject::disconnect(&obj, &QAbstractItemView::viewportEntered, &obj, &QTreeView::expandAll); + } + } break; + case 3: { + QTreeView obj; + QBENCHMARK { + QObject::disconnect(QObject::connect(&obj, SIGNAL(viewportEntered()), &obj, SLOT(expandAll()))); + } + } break; + case 4: { + QTreeView obj; + QBENCHMARK { + QObject::disconnect(QObject::connect(&obj, SIGNAL(viewportEntered( )), &obj, SLOT(expandAll( )))); + } + } break; + case 5: { + QTreeView obj; + QBENCHMARK { + QObject::disconnect(QObject::connect(&obj, &QAbstractItemView::viewportEntered, &obj, &QTreeView::expandAll)); + } + } break; + case 6: { + QTreeView obj; + Functor functor; + QBENCHMARK { + QObject::disconnect(QObject::connect(&obj, &QAbstractItemView::viewportEntered, functor)); + } + } break; } } -- cgit v1.2.3