From 3006495403061a9e90636616049247b8dc55325f Mon Sep 17 00:00:00 2001 From: dt <qtc-committer@nokia.com> Date: Fri, 13 Mar 2009 13:55:59 +0100 Subject: [PATCH] Fixes: Make opening complex projects 6 times faster. Details: Optimize addFileNodes and addFolderNodes. Probably has no effect for qt4projectmanager. --- .../cmakeprojectmanager/cmakeproject.cpp | 3 +- src/plugins/projectexplorer/projectnodes.cpp | 42 ++++++++++++++++--- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 05ae4c52b44..28ccae16958 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -112,6 +112,7 @@ void CMakeProject::parseCMakeLists() QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList(); // Manually add the CMakeLists.txt file fileList.append(new ProjectExplorer::FileNode(sourceDirectory + "/CMakeLists.txt", ProjectExplorer::ProjectFileType, false)); + buildTree(m_rootNode, fileList); foreach (ProjectExplorer::FileNode *fn, fileList) m_files.append(fn->path()); @@ -309,6 +310,7 @@ MakeStep *CMakeProject::makeStep() const return 0; } + void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader) { Project::restoreSettingsImpl(reader); @@ -341,7 +343,6 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader } - parseCMakeLists(); // Gets the directory from the active buildconfiguration if (!hasUserFile) { diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 05d962fc052..e0958b3abe4 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -386,14 +386,30 @@ void ProjectNode::addFolderNodes(const QList<FolderNode*> &subFolders, FolderNod qDebug("Project node has already a parent folder")); folder->setParentFolderNode(parentFolder); folder->setProjectNode(this); - parentFolder->m_subFolderNodes.append(folder); + + // Find the correct place to insert + if (parentFolder->m_subFolderNodes.count() == 0 || sortNodesByPath(parentFolder->m_subFolderNodes.last(), folder)) { + // empty list or greater then last node + parentFolder->m_subFolderNodes.append(folder); + } else { + // Binary Search for insertion point + int l = 0; + int r = parentFolder->m_subFolderNodes.count(); + while (l != r) { + int i = (l + r) / 2; + if (sortNodesByPath(folder, parentFolder->m_subFolderNodes.at(i))) { + r = i; + } else { + l = i + 1; + } + } + parentFolder->m_subFolderNodes.insert(l, folder); + } // project nodes have to be added via addProjectNodes QTC_ASSERT(folder->nodeType() != ProjectNodeType, qDebug("project nodes have to be added via addProjectNodes")); } - qSort(parentFolder->m_subFolderNodes.begin(), parentFolder->m_subFolderNodes.end(), - sortNodesByPath); if (emitSignals) foreach (NodesWatcher *watcher, m_watchers) @@ -461,9 +477,25 @@ void ProjectNode::addFileNodes(const QList<FileNode*> &files, FolderNode *folder file->setParentFolderNode(folder); file->setProjectNode(this); - folder->m_fileNodes.append(file); + // Now find the correct place to insert file + if (folder->m_fileNodes.count() == 0 || sortNodesByPath(folder->m_fileNodes.last(), file)) { + // empty list or greater then last node + folder->m_fileNodes.append(file); + } else { + // Binary Search for insertion point + int l = 0; + int r = folder->m_fileNodes.count(); + while (l != r) { + int i = (l + r) / 2; + if (sortNodesByPath(file, folder->m_fileNodes.at(i))) { + r = i; + } else { + l = i + 1; + } + } + folder->m_fileNodes.insert(l, file); + } } - qSort(folder->m_fileNodes.begin(), folder->m_fileNodes.end(), sortNodesByPath); if (emitSignals) foreach (NodesWatcher *watcher, m_watchers) -- GitLab