aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2021-10-07 16:29:28 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-10-08 12:09:20 +0000
commitde3e33a76b10ec59d9603655710f08988365f3a9 (patch)
treee05eb3af7bd2132f59618d4aafc99bab0d35a7bd
parent2adec9274e7fd0e3bf713485d1776eeda3f74b5c (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.cpp11
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) {