From de3e33a76b10ec59d9603655710f08988365f3a9 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 7 Oct 2021 16:29:28 +0200 Subject: [PATCH] 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 --- .../cmakeprojectmanager/fileapidataextractor.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index f800765ae9e..cabac0b3b98 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -653,9 +653,16 @@ std::unique_ptr generateRootProjectNode( void setupLocationInfoForTargets(CMakeProjectNode *rootNode, const QList &targets) { + const QSet titles = Utils::transform(targets, &CMakeBuildTarget::title); + QHash 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( - rootNode->findNode(Utils::equal(&Node::buildKey, t.title))); + FolderNode *folderNode = buildKeyToNode.value(t.title); if (folderNode) { QSet> locations; auto dedup = [&locations](const Backtrace &bt) {