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>
This commit is contained in:
Jarek Kobus
2021-10-07 16:29:28 +02:00
parent 2adec9274e
commit de3e33a76b

View File

@@ -653,9 +653,16 @@ std::unique_ptr<CMakeProjectNode> generateRootProjectNode(
void setupLocationInfoForTargets(CMakeProjectNode *rootNode, const QList<CMakeBuildTarget> &targets) 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) { for (const CMakeBuildTarget &t : targets) {
FolderNode *folderNode = static_cast<FolderNode *>( FolderNode *folderNode = buildKeyToNode.value(t.title);
rootNode->findNode(Utils::equal(&Node::buildKey, t.title)));
if (folderNode) { if (folderNode) {
QSet<std::pair<FilePath, int>> locations; QSet<std::pair<FilePath, int>> locations;
auto dedup = [&locations](const Backtrace &bt) { auto dedup = [&locations](const Backtrace &bt) {