diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2012-07-30 00:33:18 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-30 13:51:22 +0200 |
commit | ed4939eaac529e40a52762118ddbf153c2bf0c16 (patch) | |
tree | 612a03582f07cbb2000e20627380c1962111847d /tests/auto | |
parent | 36dd62ecaf692f0e518ded6abe981d5a060064a2 (diff) |
Improve performance of QArrayData::Grow autotest
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>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index d3cc92080d..dea777d652 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -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) |