Der QML-Disk-Cache
Um eine optimale Leistung zu erzielen, werden QML-Dokumente entweder bereits während des Build-Prozesses vorkompiliert oder nach der Kompilierung zur Laufzeit zwischengespeichert. Auf dieser Seite werden beide Strategien beschrieben sowie die Konfiguration des Caching-Verhaltens erläutert.
Vorabkompilierung
Sie sollten Ihre QML-Module mit `qt_add_qml_module` definieren, um sicherzustellen, dass der „Qt Quick “-Compiler Ihre QML- und JavaScript-Dateien vorab verarbeitet. Dies garantiert optimale Leistung zur Laufzeit.
Der „Qt Quick “-Compiler generiert Bytecode für jede Funktion und jede Bindung. Dieser Bytecode kann vom QML-Interpreter und vom Just-in-Time (JIT)-Compiler in der QML-Engine verwendet werden. Darüber hinaus generiert der „Qt Quick “-Compiler nativen Code für geeignete Funktionen und Bindungen. Der native Code wird direkt ausgeführt, was zu einer besseren Leistung führt als das Interpretieren oder die Just-in-Time-Kompilierung von Bytecode. Sowohl der Bytecode als auch der native Code werden anschließend in die Binärdatei Ihrer Anwendung kompiliert.
Ein Vorteil der Ahead-of-Time-Kompilierung besteht darin, dass Syntaxfehler in Ihren QML-Dokumenten bereits zur Kompilierungszeit der Anwendung erkannt werden und nicht erst zur Laufzeit, wenn die Datei geladen wird.
Mit CMake
Wenn Sie CMake mit `qt_add_qml_module` verwenden, werden QML-Dateien automatisch im Voraus kompiliert. Sie sollten Ihre QML-Dokumente nach Möglichkeit aus dem Ressourcen-Dateisystem laden. Dadurch wird sichergestellt, dass die QML-Engine den im Voraus kompilierten Code finden kann.
Mit qmake
Bei Verwendung von qmake können Sie die Vorabkompilierung aktivieren, indem Sie in Ihrer Projektdatei „ CONFIG += qtquickcompiler “ angeben. Qt Creator verfügt über eine Einstellung, mit der diese Direktive an die qmake-Befehlszeile übergeben werden kann. Standardmäßig ist sie für Release- und Profil-Builds aktiviert.
Bei der Verwendung von qmake müssen Sie Ihr Projekt auf eine bestimmte Weise organisieren:
- Alle QML-Dokumente (einschließlich JavaScript-Dateien) müssen als Ressourcen über das Qt-Ressourcensystem eingebunden werden.
- Ihre Anwendung muss die QML-Dokumente über das URL-Schema „
qrc:///“ laden.
Beachten Sie, dass qmake nicht so viele Informationen an den „Qt Quick “-Compiler übergeben kann wie CMake. Daher enthält die Kompilierung weniger nativen Code.
Laufzeit-Disk-Caching
Wenn zur Laufzeit kein vorkompilierter Code gefunden wird oder dieser nicht verwendet werden kann, kompiliert die QML-Engine QML-Dokumente im laufenden Betrieb in eine Bytecode-Darstellung. Anstatt dasselbe Dokument bei jedem Laden neu zu kompilieren, speichert die QML-Engine den kompilierten Bytecode im Cache. Der Caching-Vorgang erfolgt automatisch: Jedes Mal, wenn Sie ein geändertes QML-Dokument laden, wird der Cache automatisch neu erstellt.
Dateiformat und Speicherort des Caches
Cache-Dateien verwenden die folgenden Dateiendungen:
.qmlcfür kompilierte QML-Dokumente.jscfür importierte JavaScript-Dateien.mjscfür ECMAScript-Module
Cache-Dateien befinden sich in einem Unterverzeichnis namens „ qmlcache “ des System-Cache-Verzeichnisses, wie unter QStandardPaths::CacheLocation angegeben.
Speichereffizienz
Cache-Dateien werden auf POSIX-konformen Betriebssystemen über den Systemaufruf „ mmap() “ oder unter Windows über „ CreateFileMapping() “ geladen. Dieser Ansatz der Speicherabbildung führt zu erheblichen Speichereinsparungen. Wenn zudem mehrere Anwendungen dasselbe QML-Dokument verwenden, wird der für den Code benötigte Speicher zwischen den Anwendungsprozessen gemeinsam genutzt, was den Speicheraufwand weiter reduziert.
Cache-Validierung
Cache-Dateien und vorab kompilierter Code werden nur geladen, wenn alle folgenden Bedingungen erfüllt sind:
- Die Qt-Version hat sich nicht geändert
- Der Quellcode in der Originaldatei hat sich nicht geändert
- Der QML-Debugger läuft nicht
- Die Validierung des AOT-Codes ist erfolgreich
Beachten Sie, dass die Umgebungsvariable „ QML_FORCE_DISK_CACHE “ (siehe unten) die Bedingung bezüglich des QML-Debuggers außer Kraft setzen kann. Die anderen Umgebungsvariablen haben keinen Einfluss auf diese Validierungsbedingungen.
Validierung von im Voraus generiertem nativem Code
Der vom „Qt Quick “-Compiler generierte native Code basiert auf bestimmten Annahmen. Wenn sich die Bedingungen, unter denen der Code ausgeführt wird, von denen unterscheiden, unter denen er kompiliert wurde, kann die Verwendung des Codes unsicher sein. Daher wird der native Code zur Laufzeit anhand der zusammen mit ihm gespeicherten Metadaten validiert. Wenn diese Validierung erfolgreich ist, wird der Code wie gewohnt ausgeführt. Fällt sie fehl, weicht die Ausführung stillschweigend auf die Interpretation des Bytecodes aus. Diese Validierung erfolgt einmal pro Datei, und zwar beim ersten Laden des Codes, und genehmigt oder lehnt alle Funktionen und Bindungen in dieser QML-Datei als Ganzes ab.
Sie können die Validierung von AOT-Code anpassen:
- Um die Validierung zur Laufzeit zu deaktivieren, setzen Sie die Umgebungsvariable `
QV4_SKIP_AOT_VALIDATION`. Dadurch vermeiden Sie den geringen Overhead, der durch die Durchführung der Validierung entsteht.QV4_SKIP_AOT_VALIDATION=1 ./myQmlApp - Um sicherzustellen, dass die Validierung zur Laufzeit erfolgreich ist, setzen Sie die Umgebungsvariable `
QV4_FAIL_ON_INVALID_AOT`. Wenn die Validierung fehlschlägt, wird das Programm beendet. So können Sie beispielsweise sicherstellen, dass kompilierte Funktionen tatsächlich als nativer Code ausgeführt werden.QV4_FAIL_ON_INVALID_AOT=1 ./myQmlApp - Um die Funktion vollständig zu deaktivieren und zu verhindern, dass der „Qt Quick “-Compiler die Metadaten und die Validierungslogik generiert, übergeben Sie `
NO_GENERATE_AOT_VALIDATION` an ` qt_add_qml_module`.qt_add_qml_module(... NO_GENERATE_AOT_VALIDATION)
Konfiguration
Sie können das Caching-Verhalten mithilfe der Umgebungsvariablen ` QML_DISK_CACHE` feinabstimmen, die eine durch Kommas getrennte Liste von Optionen erwartet. Zum Beispiel:
QML_DISK_CACHE=aot,qmlc-readDie verfügbaren Optionen lauten wie folgt:
| Option | Beschreibung |
|---|---|
| aot-native | Lädt die vorab kompilierten Kompilierungseinheiten und erlaubt die Ausführung von darin enthaltenem nativem Code. |
| aot-bytecode | Lädt die vorab kompilierten Kompilierungseinheiten und ermöglicht die Interpretation sowie die Just-in-Time-Kompilierung des darin enthaltenen Bytecodes. |
| aot | Abkürzung für „ aot-native,aot-bytecode “. |
| qmlc-read | Lädt alle zwischengespeicherten Kompilierungseinheiten für QML- und JavaScript-Dateien aus dem Host-Dateisystem und ermöglicht die Interpretation sowie die Just-in-Time-Kompilierung des darin enthaltenen Bytecodes. |
| qmlc-write | Erstellt beim Kompilieren einer QML- oder JavaScript-Datei im laufenden Betrieb anschließend eine Cache-Datei. Die Cache-Datei kann geladen werden, wenn dasselbe Dokument erneut angefordert wird. |
| qmlc | Abkürzung für „ qmlc-read,qmlc-write “. |
Darüber hinaus können Sie die folgenden Umgebungsvariablen verwenden:
| Umgebungsvariable | Beschreibung |
|---|---|
QML_DISABLE_DISK_CACHE | Deaktiviert den Festplatten-Cache und erzwingt die Neukompilierung aller QML- und JavaScript-Dateien aus dem Quellcode. „ QML_DISABLE_DISK_CACHE “ überschreibt „ QML_DISK_CACHE “. |
QML_FORCE_DISK_CACHE | Aktiviert den Festplatten-Cache auch beim Debuggen von QML. In diesem Fall können Sie den JavaScript-Debugger nicht verwenden. Es kann beispielsweise vorkommen, dass das Programm nicht an Haltepunkten anhält. Sie können jedoch weiterhin den QML-Inspector nutzen, um die Objekthierarchie zu untersuchen. „ QML_FORCE_DISK_CACHE “ überschreibt „ QML_DISABLE_DISK_CACHE “ und „ QML_DISK_CACHE “. |
QML_DISK_CACHE_PATH | Legt einen benutzerdefinierten Speicherort fest, an dem die Cache-Dateien anstelle des Standard-Speicherorts abgelegt werden sollen. |
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.