forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||
|
Reference in New Issue
Block a user