aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2018-07-20 09:58:08 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2018-07-30 19:46:34 +0000
commit88bdcd0b7fa62a7ea0fdc2286ad1f51d869fd3cf (patch)
treebabb719305d04af155a394dd02f1d80b22fc2a81
parentf67ffaad9742cd1fc0d2576de0a2fd20bc48c3e6 (diff)
Add debug code for dumping unit stats
This is useful for profiling the sizes of cache files. Change-Id: I831d0a20c4eda3d707221a61fa7290857605c7fb Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/qml/compiler/qqmlirbuilder.cpp22
-rw-r--r--src/qml/compiler/qv4compiler.cpp13
2 files changed, 34 insertions, 1 deletions
diff --git a/src/qml/compiler/qqmlirbuilder.cpp b/src/qml/compiler/qqmlirbuilder.cpp
index 820f127331..04a7854d56 100644
--- a/src/qml/compiler/qqmlirbuilder.cpp
+++ b/src/qml/compiler/qqmlirbuilder.cpp
@@ -1758,6 +1758,28 @@ QV4::CompiledData::Unit *QmlUnitGenerator::generate(Document &output, const QV4:
qmlUnit->generateChecksum();
+ static const bool showStats = qEnvironmentVariableIsSet("QML_SHOW_UNIT_STATS");
+ if (showStats) {
+ qDebug() << "Generated QML unit that is" << qmlUnit->unitSize << "bytes big contains:";
+ qDebug() << " " << qmlUnit->functionTableSize << "functions";
+ qDebug() << " " << unitSize << "for JS unit";
+ qDebug() << " " << importSize << "for imports";
+ qDebug() << " " << objectsSize << "for" << qmlUnit->nObjects << "objects";
+ quint32 totalBindingCount = 0;
+ for (quint32 i = 0; i < qmlUnit->nObjects; ++i)
+ totalBindingCount += qmlUnit->objectAt(i)->nBindings;
+ qDebug() << " " << totalBindingCount << "bindings";
+ quint32 totalCodeSize = 0;
+ for (quint32 i = 0; i < qmlUnit->functionTableSize; ++i)
+ totalCodeSize += qmlUnit->functionAt(i)->codeSize;
+ qDebug() << " " << totalCodeSize << "bytes total byte code";
+ qDebug() << " " << qmlUnit->stringTableSize << "strings";
+ quint32 totalStringSize = 0;
+ for (quint32 i = 0; i < qmlUnit->stringTableSize; ++i)
+ totalStringSize += QV4::CompiledData::String::calculateSize(qmlUnit->stringAt(i));
+ qDebug() << " " << totalStringSize << "bytes total strings";
+ }
+
return qmlUnit;
}
diff --git a/src/qml/compiler/qv4compiler.cpp b/src/qml/compiler/qv4compiler.cpp
index 76779fece8..8a61333315 100644
--- a/src/qml/compiler/qv4compiler.cpp
+++ b/src/qml/compiler/qv4compiler.cpp
@@ -521,15 +521,20 @@ QV4::CompiledData::Unit QV4::Compiler::JSUnitGenerator::generateHeader(QV4::Comp
nextOffset = (nextOffset + 7) & ~quint32(0x7);
+ quint32 functionSize = 0;
+
for (int i = 0; i < module->functions.size(); ++i) {
Context *f = module->functions.at(i);
blockAndFunctionOffsets[i] = nextOffset;
const int qmlIdDepsCount = f->idObjectDependencies.count();
const int qmlPropertyDepsCount = f->scopeObjectPropertyDependencies.count() + f->contextObjectPropertyDependencies.count();
- nextOffset += QV4::CompiledData::Function::calculateSize(f->arguments.size(), f->locals.size(), f->lineNumberMapping.size(), f->nestedContexts.size(),
+ quint32 size = QV4::CompiledData::Function::calculateSize(f->arguments.size(), f->locals.size(), f->lineNumberMapping.size(), f->nestedContexts.size(),
qmlIdDepsCount, qmlPropertyDepsCount, f->code.size());
+ functionSize += size - f->code.size();
+ nextOffset += size;
}
+
blockAndFunctionOffsets += module->functions.size();
for (int i = 0; i < module->classes.size(); ++i) {
@@ -566,5 +571,11 @@ QV4::CompiledData::Unit QV4::Compiler::JSUnitGenerator::generateHeader(QV4::Comp
unit.unitSize = nextOffset;
+ static const bool showStats = qEnvironmentVariableIsSet("QML_SHOW_UNIT_STATS");
+ if (showStats) {
+ qDebug() << "Generated JS unit that is" << unit.unitSize << "bytes contains:";
+ qDebug() << " " << functionSize << "bytes for non-code function data for" << unit.functionTableSize << "functions";
+ }
+
return unit;
}