Improve performance of QArrayData::Grow autotest
authorJoão Abecasis <joao.abecasis@nokia.com>
Sun, 29 Jul 2012 22:33:18 +0000 (00:33 +0200)
committerQt by Nokia <qt-info@nokia.com>
Thu, 30 Aug 2012 11:51:22 +0000 (13:51 +0200)
Doing element-wise insertions for the full range of the test made
testing under valgrind extremely slow. When a reallocation is detected
we now resize() the container close to capacity(), while verifying this
doesn't unnecessarily re-allocate either.

Change-Id: Idf7015cf390e366fe444e7ca14c904a2d54ff48b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp

index d3cc920..dea777d 100644 (file)
@@ -1654,26 +1654,47 @@ void tst_QArrayData::grow()
     SimpleVector<int> vector;
 
     QCOMPARE(vector.size(), size_t(0));
+    QCOMPARE(vector.capacity(), size_t(0));
 
-    size_t previousCapacity = vector.capacity();
+    size_t previousCapacity = 0;
     size_t allocations = 0;
-    for (size_t i = 1; i < (1 << 20); ++i) {
+    for (size_t i = 1; i < (1 << 20); ++i) {
         int source[1] = { int(i) };
         vector.append(source, source + 1);
         QCOMPARE(vector.size(), i);
         if (vector.capacity() != previousCapacity) {
+            // Don't re-allocate until necessary
+            QVERIFY(previousCapacity < i);
+
             previousCapacity = vector.capacity();
             ++allocations;
+
+            // Going element-wise is slow under valgrind
+            if (previousCapacity - i > 10) {
+                i = previousCapacity - 5;
+                vector.back() = -i;
+                vector.resize(i);
+
+                // It's still not the time to re-allocate
+                QCOMPARE(vector.capacity(), previousCapacity);
+            }
         }
     }
-    QCOMPARE(vector.size(), size_t(1 << 20));
+    QVERIFY(vector.size() >= size_t(1 << 20));
 
     // QArrayData::Grow prevents excessive allocations on a growing container
     QVERIFY(allocations > 20 / 2);
     QVERIFY(allocations < 20 * 2);
 
-    for (size_t i = 0; i < (1 << 20); ++i)
-        QCOMPARE(const_(vector).at(i), int(i + 1));
+    for (size_t i = 0; i < vector.size(); ++i) {
+        int value = const_(vector).at(i);
+        if (value < 0) {
+            i = -value;
+            continue;
+        }
+
+        QCOMPARE(value, int(i + 1));
+    }
 }
 
 QTEST_APPLESS_MAIN(tst_QArrayData)