From 2a6237705cc0b2a0b85289306d724e56212a5365 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 3 Apr 2017 16:07:16 +0200 Subject: [PATCH] TreeModel/Find: Save a few cycles when searching Calls parent() only ~two out of three times and remove some function calls in the TreeModel::parent() implementation, reducing the overall footprint of this bit from ~5 to ~1.5% when searching something in the project tree (test case was Creator-in-Creator, and searching for 'dddddddddd', resulting in 8 complete scans of the tree. Task-number: QTCREATORBUG-17956 Change-Id: I4e46ef0467dd2aea58a7c944e1a2ee5c01e6fbba Reviewed-by: Tobias Hunger --- src/libs/utils/treemodel.cpp | 8 +++----- src/libs/utils/treemodel.h | 2 +- src/plugins/coreplugin/find/itemviewfind.cpp | 7 ++++--- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/libs/utils/treemodel.cpp b/src/libs/utils/treemodel.cpp index 5281ab33f5b..db8923e372a 100644 --- a/src/libs/utils/treemodel.cpp +++ b/src/libs/utils/treemodel.cpp @@ -919,11 +919,9 @@ QModelIndex BaseTreeModel::parent(const QModelIndex &idx) const if (!grandparent) return QModelIndex(); - for (int i = 0, n = grandparent->childCount(); i < n; ++i) - if (grandparent->childAt(i) == parent) - return createIndex(i, 0, static_cast(parent)); - - return QModelIndex(); + // This is on the performance-critical path for ItemViewFind. + const int i = grandparent->m_children.indexOf(parent); + return createIndex(i, 0, static_cast(parent)); } int BaseTreeModel::rowCount(const QModelIndex &idx) const diff --git a/src/libs/utils/treemodel.h b/src/libs/utils/treemodel.h index 8782d7b37df..60db234d3b4 100644 --- a/src/libs/utils/treemodel.h +++ b/src/libs/utils/treemodel.h @@ -66,7 +66,7 @@ public: using const_iterator = QVector::const_iterator; using value_type = TreeItem *; - int childCount() const { return end() - begin(); } + int childCount() const { return m_children.size(); } int indexInParent() const; TreeItem *childAt(int index) const; int indexOf(const TreeItem *item) const; diff --git a/src/plugins/coreplugin/find/itemviewfind.cpp b/src/plugins/coreplugin/find/itemviewfind.cpp index 3588f125ece..cc2dd466e54 100644 --- a/src/plugins/coreplugin/find/itemviewfind.cpp +++ b/src/plugins/coreplugin/find/itemviewfind.cpp @@ -249,12 +249,13 @@ QModelIndex ItemViewFind::nextIndex(const QModelIndex &idx, bool *wrapped) const return model->index(0, 0); // same parent has more columns, go to next column - if (idx.column() + 1 < model->columnCount(idx.parent())) - return model->index(idx.row(), idx.column() + 1, idx.parent()); + const QModelIndex parentIdx = idx.parent(); + if (idx.column() + 1 < model->columnCount(parentIdx)) + return model->index(idx.row(), idx.column() + 1, parentIdx); // tree views have their children attached to first column // make sure we are at first column - QModelIndex current = model->index(idx.row(), 0, idx.parent()); + QModelIndex current = model->index(idx.row(), 0, parentIdx); // check for children if (d->m_option == FetchMoreWhileSearching && model->canFetchMore(current))