aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2021-10-08 15:55:41 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-10-08 16:27:02 +0000
commitdfb5ab475e4388c839a9226e854fc61c53a94e01 (patch)
treea58fea0b9f31a0ec9a453d0669aea9ed4ca8bef9
parent7bb21fcfff2b0fe6c6248ff85cdafae452ef7c8c (diff)
Optimize addTargets() method
Don't lookup for matching targetDetails on every iteration. Before we start a loop we prepare the appropriate hash and use it on every iteration instead. This shortens the total time spent on findOrDefault from about 2 seconds to about 10 miliseconds now. Change-Id: I89bb3f472bc9071a54f9900fa057f87b57d4742d Reviewed-by: Cristian Adam <cristian.adam@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--src/plugins/cmakeprojectmanager/fileapidataextractor.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
index cabac0b3b9..c4f4810f34 100644
--- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
+++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp
@@ -595,9 +595,20 @@ void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cm
const FilePath &sourceDir,
const FilePath &buildDir)
{
+ QHash<QString, const TargetDetails *> targetDetailsHash;
+ for (const TargetDetails &t : targetDetails)
+ targetDetailsHash.insert(t.id, &t);
+ const TargetDetails defaultTargetDetails;
+ auto getTargetDetails = [&targetDetailsHash, &defaultTargetDetails](const QString &id)
+ -> const TargetDetails & {
+ auto it = targetDetailsHash.constFind(id);
+ if (it != targetDetailsHash.constEnd())
+ return *it.value();
+ return defaultTargetDetails;
+ };
+
for (const FileApiDetails::Target &t : config.targets) {
- const TargetDetails &td = Utils::findOrDefault(targetDetails,
- Utils::equal(&TargetDetails::id, t.id));
+ const TargetDetails &td = getTargetDetails(t.id);
const FilePath dir = directorySourceDir(config, sourceDir, t.directory);