Benchmark the new signal slot connection syntax.
authorOlivier Goffart <ogoffart@woboq.com>
Fri, 25 Nov 2011 18:00:01 +0000 (19:00 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 30 Nov 2011 00:04:34 +0000 (01:04 +0100)
 - 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>
tests/benchmarks/corelib/kernel/qobject/main.cpp

index 7ca4144..13ba073 100644 (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");
 
-    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<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();
-    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;
     }
 }