diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-10-08 15:55:41 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-10-08 16:27:02 +0000 |
commit | dfb5ab475e4388c839a9226e854fc61c53a94e01 (patch) | |
tree | a58fea0b9f31a0ec9a453d0669aea9ed4ca8bef9 | |
parent | 7bb21fcfff2b0fe6c6248ff85cdafae452ef7c8c (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.cpp | 15 |
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); |