From 1b688b51fdffa287fa16c4a30281b9f8d43cf2b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antti=20M=C3=A4=C3=A4tt=C3=A4?= Date: Mon, 12 Sep 2022 13:58:13 +0300 Subject: [PATCH] Optimize TimelineModelPrivate::incrementStartIndices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reduces the overhead of the function by a factor of ~500(depending on the event count) by having the Range(start) index to the RangeEnd so that we can only increment the RangeEnds that actually need to be incremented. Fixes: QTCREATORBUG-28162 Change-Id: I9daa711d0a1d960b232c5ed30564271daa68d1aa Reviewed-by: Tomi Korpipää Reviewed-by: Janne Koskinen Reviewed-by: Ulf Hermann Reviewed-by: Qt CI Bot --- src/libs/tracing/timelinemodel.cpp | 10 ++++++++-- src/libs/tracing/timelinemodel_p.h | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/libs/tracing/timelinemodel.cpp b/src/libs/tracing/timelinemodel.cpp index 0be3d9e84e5..e41aa82941b 100644 --- a/src/libs/tracing/timelinemodel.cpp +++ b/src/libs/tracing/timelinemodel.cpp @@ -444,7 +444,10 @@ int TimelineModel::insert(qint64 startTime, qint64 duration, int selectionId) int index = d->insertStart(TimelineModelPrivate::Range(startTime, duration, selectionId)); if (index < d->ranges.size() - 1) d->incrementStartIndices(index); - d->insertEnd(TimelineModelPrivate::RangeEnd(index, startTime + duration)); + int endIndex = d->insertEnd(TimelineModelPrivate::RangeEnd(index, startTime + duration)); + d->setEndIndex(index, endIndex); + if (endIndex < d->endTimes.size() - 1) + d->incrementEndIndices(endIndex); return index; } @@ -468,7 +471,10 @@ int TimelineModel::insertStart(qint64 startTime, int selectionId) void TimelineModel::insertEnd(int index, qint64 duration) { d->ranges[index].duration = duration; - d->insertEnd(TimelineModelPrivate::RangeEnd(index, d->ranges[index].start + duration)); + int endIndex = d->insertEnd(TimelineModelPrivate::RangeEnd(index, d->ranges[index].start + duration)); + d->setEndIndex(index, endIndex); + if (endIndex < d->endTimes.size() - 1) + d->incrementEndIndices(endIndex); } bool TimelineModel::expanded() const diff --git a/src/libs/tracing/timelinemodel_p.h b/src/libs/tracing/timelinemodel_p.h index 98e7af20fef..88a64e1ab3c 100644 --- a/src/libs/tracing/timelinemodel_p.h +++ b/src/libs/tracing/timelinemodel_p.h @@ -52,13 +52,14 @@ public: }; struct Range { - Range() : start(-1), duration(-1), selectionId(-1), parent(-1) {} + Range() : start(-1), duration(-1), selectionId(-1), parent(-1), endIndex(-1) {} Range(qint64 start, qint64 duration, int selectionId) : - start(start), duration(duration), selectionId(selectionId), parent(-1) {} + start(start), duration(duration), selectionId(selectionId), parent(-1), endIndex(-1) {} qint64 start; qint64 duration; int selectionId; int parent; + int endIndex; inline qint64 timestamp() const {return start;} }; @@ -77,11 +78,21 @@ public: void incrementStartIndices(int index) { - for (RangeEnd &endTime : endTimes) { - if (endTime.startIndex >= index) - ++(endTime.startIndex); + for (index = index + 1; index < ranges.count(); index++) { + if (ranges[index].endIndex >= 0) + endTimes[ranges[index].endIndex].startIndex++; } } + void incrementEndIndices(int index) + { + for (index = index + 1; index < endTimes.count(); index++) + ranges[endTimes[index].startIndex].endIndex++; + } + + inline void setEndIndex(int index, int endIndex) + { + ranges[index].endIndex = endIndex; + } inline int insertStart(const Range &start) {