From dfb5ab475e4388c839a9226e854fc61c53a94e01 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 8 Oct 2021 15:55:41 +0200 Subject: [PATCH] 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 Reviewed-by: Qt CI Bot --- .../cmakeprojectmanager/fileapidataextractor.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp index cabac0b3b98..c4f4810f34f 100644 --- a/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp +++ b/src/plugins/cmakeprojectmanager/fileapidataextractor.cpp @@ -595,9 +595,20 @@ void addTargets(const QHash &cm const FilePath &sourceDir, const FilePath &buildDir) { + QHash 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);