diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2022-05-27 10:42:51 +0200 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2022-06-04 17:52:08 +0200 |
commit | 0d826d745bd260b90a22e2d6cbba6af0d0de284c (patch) | |
tree | 204fe3a9f73d4d8967ea70a30fb69cae0564d92d /tools | |
parent | fd79c5bc2676cd223feee8906e843893eba33b8b (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.cpp | 43 |
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); } |