diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-10-07 16:29:28 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-10-08 12:09:20 +0000 |
commit | de3e33a76b10ec59d9603655710f08988365f3a9 (patch) | |
tree | e05eb3af7bd2132f59618d4aafc99bab0d35a7bd | |
parent | 2adec9274e7fd0e3bf713485d1776eeda3f74b5c (diff) |
Optimize setupLocationInfoForTargets()
Don't search for each target separately in the node tree,
but do a one search for all targets at once.
This makes searching for nodes much faster, as in case
of loading a Qt6 project (5 main modules only) with debug build
of Creator, the searching time went down from 36 seconds into
30 miliseconds (just 1000 times faster). The number of targets
in this case was more than 5000.
Change-Id: I015f6fd2a2d5e613307cc7b65746c01a5b14c6dc
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r-- | src/plugins/cmakeprojectmanager/fileapidataextractor.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index f800765ae9..cabac0b3b9 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -653,9 +653,16 @@ std::unique_ptr<CMakeProjectNode> generateRootProjectNode( void setupLocationInfoForTargets(CMakeProjectNode *rootNode, const QList<CMakeBuildTarget> &targets) { + const QSet<QString> titles = Utils::transform<QSet>(targets, &CMakeBuildTarget::title); + QHash<QString, FolderNode *> buildKeyToNode; + rootNode->forEachGenericNode([&buildKeyToNode, &titles](Node *node) { + FolderNode *folderNode = node->asFolderNode(); + const QString &buildKey = node->buildKey(); + if (folderNode && titles.contains(buildKey)) + buildKeyToNode.insert(buildKey, folderNode); + }); for (const CMakeBuildTarget &t : targets) { - FolderNode *folderNode = static_cast<FolderNode *>( - rootNode->findNode(Utils::equal(&Node::buildKey, t.title))); + FolderNode *folderNode = buildKeyToNode.value(t.title); if (folderNode) { QSet<std::pair<FilePath, int>> locations; auto dedup = [&locations](const Backtrace &bt) { |