From b800d8b94a7861ecf8853621f6556fca186fb5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lund=20Martsum?= Date: Thu, 29 Dec 2011 08:59:37 +0100 Subject: QHeaderView::moveSection performance boost The patch also speeds up swapSections and hideSection a lot. It work by eliminating the Span. (That is forcing each 'Span' to have exactly one element) That saves a lot of loops since we can often lookup info fast - and/or change it fast. Since it is often a complexity change, it is difficult to put %-increase on. (The most used linear function is recalcSectionStartPos() - and it has a very low constant) However comparing with the new benchmark (2500 rows) swapSection, showHideSection and moveSection are about 20-40 factors faster. (Yes, it is a lot faster!) In the benchmark moveSection is about 300 factors faster. Beside being a far better model it is also far more simple. This fix partly solves: Task-number: QTBUG-19092 Change-Id: I8deeb9315276d15c68e8a27d5dcb8e0c0badf367 Reviewed-by: Stephen Kelly --- src/widgets/itemviews/qheaderview_p.h | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'src/widgets/itemviews/qheaderview_p.h') diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index e26c4a6475..9d7d97f582 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -97,7 +97,8 @@ public: lastSectionSize(0), sectionIndicatorOffset(0), sectionIndicator(0), - globalResizeMode(QHeaderView::Interactive) + globalResizeMode(QHeaderView::Interactive), + sectionStartposRecalc(true) {} @@ -281,22 +282,24 @@ public: QLabel *sectionIndicator; QHeaderView::ResizeMode globalResizeMode; QList persistentHiddenSections; - + mutable bool sectionStartposRecalc; // header section spans struct SectionSpan { int size; - int count; + mutable int calculated_startpos; QHeaderView::ResizeMode resizeMode; - inline SectionSpan() : size(0), count(0), resizeMode(QHeaderView::Interactive) {} - inline SectionSpan(int length, int sections, QHeaderView::ResizeMode mode) - : size(length), count(sections), resizeMode(mode) {} - inline int sectionSize() const { return (count > 0 ? size / count : 0); } + inline SectionSpan() : size(0), resizeMode(QHeaderView::Interactive) {} + inline SectionSpan(int length, QHeaderView::ResizeMode mode) + : size(length), calculated_startpos(-1), resizeMode(mode) {} + inline int sectionSize() const { return size; } + inline int calculatedEndPos() const { return calculated_startpos + size; } #ifndef QT_NO_DATASTREAM + int tmpDataStreamSectionCount; inline void write(QDataStream &out) const - { out << size; out << count; out << (int)resizeMode; } + { out << size; out << 1; out << (int)resizeMode; } inline void read(QDataStream &in) - { in >> size; in >> count; int m; in >> m; resizeMode = (QHeaderView::ResizeMode)m; } + { in >> size; in >> tmpDataStreamSectionCount; int m; in >> m; resizeMode = (QHeaderView::ResizeMode)m; } #endif }; @@ -306,12 +309,10 @@ public: void removeSectionsFromSpans(int start, int end); void resizeSectionSpan(int visualIndex, int oldSize, int newSize); void setDefaultSectionSize(int size); + void recalcSectionStartPos() const; // not really const inline int headerSectionCount() const { // for debugging - int count = 0; - for (int i = 0; i < sectionSpans.count(); ++i) - count += sectionSpans.at(i).count; - return count; + return sectionSpans.count(); } inline int headerLength() const { // for debugging @@ -329,12 +330,8 @@ public: } inline int sectionSpanIndex(int visual) const { - int section_start = 0; - for (int i = 0; i < sectionSpans.count(); ++i) { - int section_end = section_start + sectionSpans.at(i).count - 1; - if (visual >= section_start && visual <= section_end) - return i; - section_start = section_end + 1; + if (visual < sectionSpans.count() && visual >= 0) { + return visual; } return -1; } -- cgit v1.2.3