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 <bradley.hughes@nokia.com>
This commit is contained in:
Olivier Goffart 2011-11-25 19:00:01 +01:00 committed by Qt by Nokia
parent 55b974faa1
commit fad19e18af

View File

@ -63,6 +63,10 @@ private slots:
void connect_disconnect_benchmark();
};
struct Functor {
void operator()(){}
};
void QObjectBenchmark::signal_slot_benchmark_data()
{
QTest::addColumn<int>("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");
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<QByteArray>("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<int>("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();
QFETCH(int, type);
switch (type) {
case 0: {
QTreeView obj;
QBENCHMARK {
QObject::connect(&obj, p, &obj, p);
QObject::disconnect(&obj, p, &obj, p);
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;
}
}