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>
This commit is contained in:
parent
36dd62ecaf
commit
ed4939eaac
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user