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(); void connect_disconnect_benchmark();
}; };
struct Functor {
void operator()(){}
};
void QObjectBenchmark::signal_slot_benchmark_data() void QObjectBenchmark::signal_slot_benchmark_data()
{ {
QTest::addColumn<int>("type"); QTest::addColumn<int>("type");
@ -70,6 +74,8 @@ void QObjectBenchmark::signal_slot_benchmark_data()
QTest::newRow("single signal/slot") << 1; QTest::newRow("single signal/slot") << 1;
QTest::newRow("multi signal/slot") << 2; QTest::newRow("multi signal/slot") << 2;
QTest::newRow("unconnected signal") << 3; QTest::newRow("unconnected signal") << 3;
QTest::newRow("single signal/ptr") << 4;
QTest::newRow("functor") << 5;
} }
void QObjectBenchmark::signal_slot_benchmark() void QObjectBenchmark::signal_slot_benchmark()
@ -78,10 +84,17 @@ void QObjectBenchmark::signal_slot_benchmark()
Object singleObject; Object singleObject;
Object multiObject; Object multiObject;
Functor functor;
singleObject.setObjectName("single"); singleObject.setObjectName("single");
multiObject.setObjectName("multi"); 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())); singleObject.connect(&singleObject, SIGNAL(signal0()), SLOT(slot0()));
}
multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(slot0())); multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(slot0()));
// multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(signal1())); // multiObject.connect(&multiObject, SIGNAL(signal0()), SLOT(signal1()));
@ -119,6 +132,10 @@ void QObjectBenchmark::signal_slot_benchmark()
QBENCHMARK { QBENCHMARK {
singleObject.emitSignal1(); 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() void QObjectBenchmark::connect_disconnect_benchmark_data()
{ {
QTest::addColumn<QByteArray>("signal"); QTest::addColumn<int>("type");
const QMetaObject *mo = &QTreeView::staticMetaObject; QTest::newRow("normalized signature") << 0;
for (int i = 0; i < mo->methodCount(); ++i) { QTest::newRow("unormalized signature") << 1;
QMetaMethod method = mo->method(i); QTest::newRow("function pointer") << 2;
if (method.methodType() != QMetaMethod::Signal) QTest::newRow("normalized signature/handle") << 3;
continue; QTest::newRow("unormalized signature/handle") << 4;
QByteArray sig = method.signature(); QTest::newRow("function pointer/handle") << 5;
QTest::newRow(sig) << sig; QTest::newRow("functor/handle") << 6;}
}
}
void QObjectBenchmark::connect_disconnect_benchmark() void QObjectBenchmark::connect_disconnect_benchmark()
{ {
QFETCH(QByteArray, signal); QFETCH(int, type);
signal.prepend('2'); switch (type) {
const char *p = signal.constData(); case 0: {
QTreeView obj; QTreeView obj;
QBENCHMARK { QBENCHMARK {
QObject::connect(&obj, p, &obj, p); QObject::connect (&obj, SIGNAL(viewportEntered()), &obj, SLOT(expandAll()));
QObject::disconnect(&obj, p, &obj, p); 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;
} }
} }