QML ディスクキャッシュ
最適なパフォーマンスを実現するため、QMLドキュメントはビルドプロセス中に事前にコンパイルされるか、または実行時にコンパイル後にキャッシュされます。このページでは、これらの両方の戦略と、キャッシュ動作の設定方法について説明します。
事前コンパイル
QMLモジュールは、qt_add_qml_moduleを使用して定義する必要があります。これにより、Qt Quick コンパイラがQMLファイルおよびJavaScriptファイルを事前に処理するようになります。これにより、実行時の最適なパフォーマンスが保証されます。
Qt Quick コンパイラは、各関数およびバインディングに対してバイトコードを生成します。このバイトコードは、QMLエンジン内のQMLインタプリタおよびジャストインタイム(JIT)コンパイラで使用できます。さらに、Qt Quick コンパイラは、適切な関数およびバインディングに対してネイティブコードを生成します。 ネイティブコードは直接実行されるため、バイトコードをインタープリタ処理したりジャストインタイム(JIT)コンパイルしたりする場合よりも高いパフォーマンスが得られます。その後、バイトコードとネイティブコードの両方が、アプリケーションのバイナリにコンパイルされます。
Ahead-of-Time(AOT)コンパイルの利点の一つは、QMLドキュメント内の構文エラーが、ファイルが読み込まれる実行時ではなく、アプリケーションのコンパイル時に検出されることです。
CMake を使用する場合
CMake とqt_add_qml_module を併用する場合、QML ファイルは自動的に事前にコンパイルされます。可能な限り、リソースファイルシステムから QML ドキュメントを読み込むようにしてください。これにより、QML エンジンが事前にコンパイルされたコードを確実に検出できるようになります。
qmake を使用する場合
qmake を使用する場合、プロジェクトファイルで `CONFIG += qtquickcompiler ` を指定することで、事前コンパイルを有効にできます。 Qt Creator には、このディレクティブを qmake コマンドラインに渡すことを可能にする設定があります。デフォルトでは、リリースおよびプロファイルビルドで有効になっています。
qmake を使用する場合、プロジェクトを特定の方法で構成する必要があります。
- すべての Qml ドキュメント(JavaScript ファイルを含む)は、Qt のリソースシステムを介してリソースとして含める必要があります。
- アプリケーションは、
qrc:///URL スキームを介して QML ドキュメントを読み込む必要があります。
qmake は、CMake ほど多くの情報をQt Quick コンパイラに渡すことはできない点に注意してください。そのため、コンパイル結果に含まれるネイティブコードの量は少なくなります。
実行時のディスクキャッシュ
実行時にプリコンパイル済みのコードが見つからない場合、またはそのコードが使用できない場合、QMLエンジンはQMLドキュメントをその場でバイトコード形式にコンパイルします。QMLエンジンは、同じドキュメントが読み込まれるたびに再コンパイルを行うのではなく、コンパイル済みのバイトコードをキャッシュします。 このキャッシュ処理は自動的に行われます。変更されたQMLドキュメントを読み込むたびに、キャッシュが自動的に再構築されます。
キャッシュファイルの形式と保存場所
キャッシュファイルには、以下の拡張子が使用されます:
.qmlcコンパイル済みの QML ドキュメントの場合.jscインポートされた JavaScript ファイル用.mjscECMAScriptモジュール用
キャッシュファイルは、QStandardPaths::CacheLocation で指定されるシステムのキャッシュディレクトリ内の「qmlcache 」というサブディレクトリに格納されます。
メモリ効率
キャッシュファイルは、POSIX 準拠のオペレーティングシステムではmmap() システムコール、Windows ではCreateFileMapping() を通じて読み込まれます。このメモリマッピング方式により、メモリを大幅に節約できます。さらに、複数のアプリケーションが同じ QML ドキュメントを使用する場合、コードに必要なメモリはアプリケーションプロセス間で共有されるため、メモリのオーバーヘッドがさらに削減されます。
キャッシュの検証
キャッシュファイルおよび事前コンパイル済みコードは、以下のすべての条件が満たされた場合にのみ読み込まれます:
- Qtのバージョンが変更されていないこと
- 元のファイル内のソースコードが変更されていないこと
- QML デバッガが実行されていない
- AOTコードの検証が成功していること
なお、QML_FORCE_DISK_CACHE (後述)は、QMLデバッガの条件を上書きする可能性があります。その他の環境変数は、これらの検証条件に影響を与えません。
事前生成されたネイティブコードの検証
Qt Quick コンパイラによって生成されたネイティブコードには、いくつかの前提条件が組み込まれています。コードが実行される環境がコンパイル時の環境と異なる場合、そのコードの使用は安全でない可能性があります。そのため、ネイティブコードは、それに付随して保存されたメタデータを使用して実行時に検証されます。この検証に合格した場合、コードは通常通り実行されます。 検証に失敗した場合、実行は黙ってバイトコードの解釈に切り替わります。この検証はファイルごとに1回、コードが最初に読み込まれた際に行われ、そのQMLファイル内のすべての関数およびバインディングをまとめて承認または拒否します。
AOTコードの検証はカスタマイズ可能です。
- 実行時の検証を無効にするには、
QV4_SKIP_AOT_VALIDATION環境変数を設定します。これにより、検証を実行する際のわずかなオーバーヘッドを回避できます。QV4_SKIP_AOT_VALIDATION=1 ./myQmlApp - 実行時に検証が確実に成功するようにするには、
QV4_FAIL_ON_INVALID_AOT環境変数を設定します。検証に失敗した場合、プログラムは終了します。これにより、例えば、コンパイルされた関数が確実にネイティブコードとして実行されることを保証できます。QV4_FAIL_ON_INVALID_AOT=1 ./myQmlApp - この機能を完全に無効にし、Qt Quick コンパイラによるメタデータおよび検証ロジックの生成を防ぐには、qt_add_qml_moduleに
NO_GENERATE_AOT_VALIDATIONを渡してください。qt_add_qml_module(... NO_GENERATE_AOT_VALIDATION)
設定
環境変数 `QML_DISK_CACHE` を使用すると、キャッシュの動作を微調整できます。この変数には、カンマ区切りのオプションリストを指定します。例:
QML_DISK_CACHE=aot,qmlc-read利用可能なオプションは以下の通りです:
| オプション | 説明 |
|---|---|
| aot-native | 事前にコンパイルされたコンパイルユニットを読み込み、それらに含まれるネイティブコードの実行を許可します。 |
| aot-bytecode | 事前にコンパイルされたコンパイルユニットを読み込み、それらに含まれるバイトコードの解釈およびジャストインタイムコンパイルを許可します。 |
| aot | aot-native,aot-bytecode の省略形。 |
| qmlc-read | ホストファイルシステムから QML および JavaScript ファイル用のキャッシュされたコンパイルユニットをロードし、それらに含まれるバイトコードの解釈およびジャストインタイムコンパイルを可能にする。 |
| qmlc-write | QML または JavaScript ファイルをオンザフライでコンパイルする際、その後キャッシュファイルを作成します。このキャッシュファイルは、同じドキュメントが再度リクエストされた際に読み込むことができます。 |
| qmlc | qmlc-read,qmlc-write の省略形です。 |
さらに、以下の環境変数を使用できます:
| 環境変数 | 説明 |
|---|---|
QML_DISABLE_DISK_CACHE | ディスクキャッシュを無効にし、すべての QML および JavaScript ファイルについてソースからの再コンパイルを強制します。QML_DISABLE_DISK_CACHE はQML_DISK_CACHE を上書きします。 |
QML_FORCE_DISK_CACHE | QMLのデバッグ時でもディスクキャッシュを有効にします。この設定では、JavaScriptデバッガーは使用できません。たとえば、ブレークポイントで停止できなくなる場合があります。ただし、QMLインスペクタを使用してオブジェクト階層を調査することは可能です。QML_FORCE_DISK_CACHE は、QML_DISABLE_DISK_CACHE およびQML_DISK_CACHE を上書きします。 |
QML_DISK_CACHE_PATH | デフォルトの保存場所の代わりに、キャッシュファイルを保存するカスタム場所を指定します。 |
© 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.