From 3782eebfaf8326fec644e7754f3727ddfdfa1d84 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 5 Feb 2020 16:30:33 +0100 Subject: ModelEditor: Do not query all files in the project for their mime type Consulting the mime type database is much too expensive to do it for all files in a project, so take a shortcut. Example benchmark: When loading the Qt Creator super project (with all the commercial plugins) on my Linux machine, with this patch the time spent in ModelIndexer::scanProject() goes down from ~8 seconds to under 300 milliseconds. Note that the UI is frozen during that period. Task-number: QTCREATORBUG-18533 Change-Id: Id75d6bbcf37b4f4e41383a089e9e0dc5262cfbae Reviewed-by: hjk Reviewed-by: Jochen Becher --- src/plugins/modeleditor/modelindexer.cpp | 29 +++++++++++++++++------------ src/plugins/modeleditor/modelindexer.h | 5 ++++- 2 files changed, 21 insertions(+), 13 deletions(-) (limited to 'src/plugins/modeleditor') diff --git a/src/plugins/modeleditor/modelindexer.cpp b/src/plugins/modeleditor/modelindexer.cpp index c5a44375085..5186a269f33 100644 --- a/src/plugins/modeleditor/modelindexer.cpp +++ b/src/plugins/modeleditor/modelindexer.cpp @@ -399,17 +399,20 @@ void ModelIndexer::scanProject(ProjectExplorer::Project *project) QQueue filesQueue; QSet filesSet; - for (const Utils::FilePath &file : files) { - QFileInfo fileInfo = file.toFileInfo(); - Utils::MimeType mimeType = Utils::mimeTypeForFile(fileInfo); - if (mimeType.name() == QLatin1String(Constants::MIME_TYPE_MODEL)) { - QueuedFile queuedFile(file.toString(), project, fileInfo.lastModified()); - filesQueue.append(queuedFile); - filesSet.insert(queuedFile); + const Utils::MimeType modelMimeType = Utils::mimeTypeForName(Constants::MIME_TYPE_MODEL); + if (modelMimeType.isValid()) { + for (const Utils::FilePath &file : files) { + const QFileInfo fileInfo = file.toFileInfo(); + if (modelMimeType.suffixes().contains(fileInfo.completeSuffix())) { + QueuedFile queuedFile(file.toString(), project, fileInfo.lastModified()); + filesQueue.append(queuedFile); + filesSet.insert(queuedFile); + } } } - QString defaultModelFile = findFirstModel(project->rootProjectNode()); + // FIXME: This potentially iterates over all files again. + QString defaultModelFile = findFirstModel(project->rootProjectNode(), modelMimeType); bool filesAreQueued = false; { @@ -460,15 +463,17 @@ void ModelIndexer::scanProject(ProjectExplorer::Project *project) emit filesQueued(); } -QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode) +QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode, + const Utils::MimeType &mimeType) { + if (!mimeType.isValid()) + return QString(); foreach (ProjectExplorer::FileNode *fileNode, folderNode->fileNodes()) { - Utils::MimeType mimeType = Utils::mimeTypeForFile(fileNode->filePath().toFileInfo()); - if (mimeType.name() == QLatin1String(Constants::MIME_TYPE_MODEL)) + if (mimeType.suffixes().contains(fileNode->filePath().toFileInfo().completeSuffix())) return fileNode->filePath().toString(); } foreach (ProjectExplorer::FolderNode *subFolderNode, folderNode->folderNodes()) { - QString modelFileName = findFirstModel(subFolderNode); + QString modelFileName = findFirstModel(subFolderNode, mimeType); if (!modelFileName.isEmpty()) return modelFileName; } diff --git a/src/plugins/modeleditor/modelindexer.h b/src/plugins/modeleditor/modelindexer.h index da925977b6a..708ec26e9b4 100644 --- a/src/plugins/modeleditor/modelindexer.h +++ b/src/plugins/modeleditor/modelindexer.h @@ -34,6 +34,8 @@ class Project; class FolderNode; } +namespace Utils { class MimeType; } + namespace ModelEditor { namespace Internal { @@ -72,7 +74,8 @@ private: private: void scanProject(ProjectExplorer::Project *project); - QString findFirstModel(ProjectExplorer::FolderNode *folderNode); + QString findFirstModel(ProjectExplorer::FolderNode *folderNode, + const Utils::MimeType &mimeType); void forgetProject(ProjectExplorer::Project *project); void removeModelFile(const QString &file, ProjectExplorer::Project *project); void removeDiagramReferenceFile(const QString &file, ProjectExplorer::Project *project); -- cgit v1.2.3