aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2022-05-27 10:42:51 +0200
committerAlexandru Croitor <alexandru.croitor@qt.io>2022-06-04 17:52:08 +0200
commit0d826d745bd260b90a22e2d6cbba6af0d0de284c (patch)
tree204fe3a9f73d4d8967ea70a30fb69cae0564d92d /tools
parentfd79c5bc2676cd223feee8906e843893eba33b8b (diff)
qmlimportscanner: Add logging to help with debugging performance
Add two new logging categories: qt.qml.import.scanner qt.qml.import.scanner.files The first one logs how many files are scanned, which files are scanned timestamps for operations done on each file, durations for the operations that we expect to take longer. The second category logs each qml file that is processed recursively (so not only the input files). Because the output is quite verbose, it's a separate category rather than being part of the first one. This is useful to identify performance bottlenecks in projects, without having to profile the executable. Pick-to: 6.2 6.3 Task-number: QTBUG-103187 Change-Id: I09506b488dda594b371d229e5fd535a534fe9515 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/qmlimportscanner/main.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/tools/qmlimportscanner/main.cpp b/tools/qmlimportscanner/main.cpp
index 9179fb008c..bc2dfce025 100644
--- a/tools/qmlimportscanner/main.cpp
+++ b/tools/qmlimportscanner/main.cpp
@@ -34,6 +34,8 @@
#include <private/qqmljsresourcefilemapper_p.h>
#include <QtCore/QCoreApplication>
+#include <QtCore/QDebug>
+#include <QtCore/QDateTime>
#include <QtCore/QDir>
#include <QtCore/QDirIterator>
#include <QtCore/QFile>
@@ -48,6 +50,7 @@
#include <QtCore/QJsonArray>
#include <QtCore/QJsonDocument>
#include <QtCore/QLibraryInfo>
+#include <QtCore/QLoggingCategory>
#include <iostream>
#include <algorithm>
@@ -56,6 +59,9 @@ QT_USE_NAMESPACE
using namespace Qt::StringLiterals;
+Q_LOGGING_CATEGORY(lcImportScanner, "qt.qml.import.scanner");
+Q_LOGGING_CATEGORY(lcImportScannerFiles, "qt.qml.import.scanner.files");
+
namespace {
QStringList g_qmlImportPaths;
@@ -402,6 +408,9 @@ QVariantList findPathsForModuleImports(const QVariantList &imports)
// Scan a single qml file for import statements
QVariantList findQmlImportsInQmlCode(const QString &filePath, const QString &code)
{
+ qCDebug(lcImportScannerFiles) << "Parsing code and finding imports in" << filePath
+ << "TS:" << QDateTime::currentMSecsSinceEpoch();
+
QQmlJS::Engine engine;
QQmlJS::Lexer lexer(&engine);
lexer.setCode(code, /*line = */ 1);
@@ -500,6 +509,7 @@ QVariantList findQmlImportsInJavascriptFile(const QString &filePath)
// Scan a single qml or js file for import statements
QVariantList findQmlImportsInFile(const QString &filePath)
{
+ const auto fileProcessTimeBegin = QDateTime::currentDateTime();
QVariantList imports;
if (filePath == QLatin1String("-")) {
QFile f;
@@ -509,9 +519,25 @@ QVariantList findQmlImportsInFile(const QString &filePath)
imports = findQmlImportsInQmlFile(filePath);
} else if (filePath.endsWith(QLatin1String(".js"))) {
imports = findQmlImportsInJavascriptFile(filePath);
+ } else {
+ qCDebug(lcImportScanner) << "Skipping file because it's not a .qml/.js file";
+ return imports;
}
- return findPathsForModuleImports(imports);
+ const auto pathsTimeBegin = QDateTime::currentDateTime();
+
+ qCDebug(lcImportScanner) << "Finding module paths for imported modules in" << filePath
+ << "TS:" << pathsTimeBegin.toMSecsSinceEpoch();
+ QVariantList importPaths = findPathsForModuleImports(imports);
+
+ const auto pathsTimeEnd = QDateTime::currentDateTime();
+ const auto duration = pathsTimeBegin.msecsTo(pathsTimeEnd);
+ const auto fileProcessingDuration = fileProcessTimeBegin.msecsTo(pathsTimeEnd);
+ qCDebug(lcImportScanner) << "Found module paths:" << importPaths.count()
+ << "TS:" << pathsTimeEnd.toMSecsSinceEpoch()
+ << "Path resolution duration:" << duration << "msecs";
+ qCDebug(lcImportScanner) << "Scan duration:" << fileProcessingDuration << "msecs";
+ return importPaths;
}
// Merge two lists of imports, discard duplicates.
@@ -578,8 +604,12 @@ QVariantList findQmlImportsInDirectory(const QString &qmlDir)
}
for (const QFileInfo &x : entries)
- if (x.isFile())
- ret = mergeImports(ret, findQmlImportsInFile(x.absoluteFilePath()));
+ if (x.isFile()) {
+ const auto entryAbsolutePath = x.absoluteFilePath();
+ qCDebug(lcImportScanner) << "Scanning file" << entryAbsolutePath
+ << "TS:" << QDateTime::currentMSecsSinceEpoch();
+ ret = mergeImports(ret, findQmlImportsInFile(entryAbsolutePath));
+ }
}
return ret;
}
@@ -591,14 +621,21 @@ QVariantList findQmlImportsRecursively(const QStringList &qmlDirs, const QString
{
QVariantList ret;
+ qCDebug(lcImportScanner) << "Scanning" << qmlDirs.count() << "root directories and"
+ << scanFiles.count() << "files.";
+
// Scan all app root qml directories for imports
for (const QString &qmlDir : qmlDirs) {
+ qCDebug(lcImportScanner) << "Scanning root" << qmlDir
+ << "TS:" << QDateTime::currentMSecsSinceEpoch();
QVariantList imports = findQmlImportsInDirectory(qmlDir);
ret = mergeImports(ret, imports);
}
// Scan app qml files for imports
for (const QString &file : scanFiles) {
+ qCDebug(lcImportScanner) << "Scanning file" << file
+ << "TS:" << QDateTime::currentMSecsSinceEpoch();
QVariantList imports = findQmlImportsInFile(file);
ret = mergeImports(ret, imports);
}