From 90fadbb3656eaf5db0aa9341f2ef4b2d44156446 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 30 Oct 2020 08:45:19 +0100 Subject: [PATCH] Remove the prepare call in QArrayData::appendInitialize() It's causing a performance bottleneck and is not required anymore after changing the allocation strategy. Take the opportunity to change the signature from using size_t to qsizetype. Change-Id: I74ff1637007cf7072de80e7383a23fdfe1ccd986 Reviewed-by: Andrei Golubev Reviewed-by: Thiago Macieira --- src/corelib/tools/qarraydataops.h | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h index 507f8f153f..ac6e25d364 100644 --- a/src/corelib/tools/qarraydataops.h +++ b/src/corelib/tools/qarraydataops.h @@ -248,12 +248,12 @@ protected: public: typedef typename QArrayDataPointer::parameter_type parameter_type; - void appendInitialize(size_t newSize) + void appendInitialize(qsizetype newSize) { Q_ASSERT(this->isMutable()); Q_ASSERT(!this->isShared()); - Q_ASSERT(newSize > size_t(this->size)); - Q_ASSERT(newSize - this->size <= size_t(this->freeSpaceAtEnd())); + Q_ASSERT(newSize > this->size); + Q_ASSERT(newSize - this->size <= this->freeSpaceAtEnd()); ::memset(static_cast(this->end()), 0, (newSize - this->size) * sizeof(T)); this->size = qsizetype(newSize); @@ -491,17 +491,17 @@ protected: public: typedef typename QArrayDataPointer::parameter_type parameter_type; - void appendInitialize(size_t newSize) + void appendInitialize(qsizetype newSize) { Q_ASSERT(this->isMutable()); Q_ASSERT(!this->isShared()); - Q_ASSERT(newSize > size_t(this->size)); - Q_ASSERT(newSize - this->size <= size_t(this->freeSpaceAtEnd())); + Q_ASSERT(newSize > this->size); + Q_ASSERT(newSize - this->size <= this->freeSpaceAtEnd()); T *const b = this->begin(); do { new (b + this->size) T; - } while (size_t(++this->size) != newSize); + } while (++this->size != newSize); } void moveAppend(T *b, T *e) @@ -1342,19 +1342,12 @@ public: // using Base::assign; // using Base::compare; - void appendInitialize(size_t newSize) + void appendInitialize(qsizetype newSize) { Q_ASSERT(this->isMutable()); Q_ASSERT(!this->isShared()); - Q_ASSERT(newSize > size_t(this->size)); - Q_ASSERT(newSize <= size_t(this->allocatedCapacity())); - - // Since this is mostly an initialization function, do not follow append - // logic of space arrangement. Instead, only prepare as much free space - // as needed for this specific operation - const size_t n = newSize - this->size; - prepareFreeSpace(GrowsForwardTag{}, n, - qMin(n, size_t(this->freeSpaceAtBegin()))); // ### perf. loss + Q_ASSERT(newSize > this->size); + Q_ASSERT(newSize - this->size <= this->freeSpaceAtEnd()); Base::appendInitialize(newSize); }