アプリケーション開発者にとって、組み込みハードウェアのパフォーマンス最適化は常に課題です。Qt Quickは、Qt Quick Compilerにより、ソースコードを変更することなくオプションを有効にするだけでパフォーマンス向上を提供します。
Qt Quick Compilerについては、研究開発チームがすでに以下のようなパフォーマンスベンチマークを実施しています。
しかし、これらのテストは主にQML言語自体に焦点を当てていると思います。アプリケーション開発者として、最も関心を持っているのはアプリケーションレベルでの潜在的な改善の可能性を評価することです。そのため、既存のQt Quick Coffee Machineデモをテスト対象として選び、Colibri iMX6ULLハードウェアプラットフォームをテストに利用しました。
テストケース
以下のケースでテストを行いました。
- qmlsc(qmlcachegen): Qt Quick Compilerのデフォルトqmlcachegenでコンパイル
- qmltc: Qt Quick CompilerのQMLタイプコンパイラでコンパイルし、qmlcachegenもデフォルトで有効にします (QML Type Compilerを参照)
- オフ:実行時環境変数 QML_DISABLE_DISK_CACHE=true を設定することで、Qt Quick Compilerのqmlcachegenを完全に無効にします
qmltcについて
Qt 6.8の時点では、qmltcはまだ技術プレビュー段階であり、いくつかの制限があります。例えば、デフォルトのQt Quickコントロールはアプリケーションで直接使用できません (Known Limitations 参照)。
これに対処するために、CMakeのトリックをいくつか使った実験的な一時的な解決策を作成しました。この解決策では、qt_add_qml_module
用のラッパー関数qt_add_qml_module_qmltc
を提供しており、CMakeターゲット指定の後で、Qt Quick Controlスタイルのパラメータを追加で受け取ります。
このリンクからアクセス可能です。使用例:
qt_add_qml_module_qmltc(apptestQtQuickControl Basic
URI testQtQuickControl
VERSION 1.0
QML_FILES
Main.qml
)
Qt Quick ControlのスタイルはC++ではなくQMLで実装されているため、qmltc
を基本スタイルのボタンを含むアプリケーションで使用すると、次のようなエラーが発生します。
Error: Main.qml:10:5: Can't compile the QML base type "Button" to C++ because it lives in "QtQuick.Controls.Basic" instead of the current file's "untitled" QML module. [compiler] Button { ^^^^^^
この制限を理解した上で、必要なQMLファイルをqmltc
に渡してコンパイルするソリューションが採用されています。qt_add_qml_module_qmltc
関数の2番目のパラメータ(例えば、Basic
)は、対応するスタイルのQMLファイルを自動的に検索してインクルードし、指定されたCMakeターゲットにバインドします。これにより、Button
などのコンポーネントがモジュール内で利用可能になります。必要なプライベートライブラリもリンクされますが、現時点ではBasicスタイルのみがサポートされています。
ベンチマーク構成
ベンチマークを実施するために、Coffee Machine デモに以下の拡張を追加しました。
- 画面遷移を自動化するバックエンドシミュレータ。
- FPS やその他のパフォーマンス指標を記録するベンチマークモジュール。
- QML エンジンのロード時間を測定するユニットテスト。
変更したソースコードはこちらです。
ベンチマークは2つのテストで構成されています。
- レンダリングパフォーマンス:シミュレータが画面遷移を自動化しながらFPSを記録します。
- 起動パフォーマンス:ユニットテストでQMLエンジンのロード時間を評価します。
以下は、100回繰り返しのベンチマーク結果です。
起動時間ベンチマーク
Qt Quick Compiler 設定 |
起動時間 (ミリ秒) |
qmlsc (qmlcachegen) |
428.04 |
qmltc |
346.74 |
Off |
682.76 |
FPS ベンチマーク
Qt Quick Compiler 設定 |
平均 FPS |
フレーム数 |
実行時間 (ミリ秒) |
qmlsc (qmlcachegen) |
50.3352 |
25181 |
500266 |
qmltc |
50.8467 |
25437 |
500268 |
Off |
50.3136 |
25170 |
500262 |
結論
qmltc
のパフォーマンスは印象的で、QMLのロード時間をほぼ半分に短縮しました。ただし、再度注意しておきますが、qmltc
はまだ技術プレビュー段階にあるため、実稼働のプロジェクトでは慎重に使用すべきです。
qmlsc
モードでも同様のパフォーマンス改善が見られました。
フレームレート(FPS)では、qmltc
も最高の数値結果を示しましたが、いずれのケースでも改善はわずかでした。これは予想通りで、コーヒーマシンのデモでは、QMLの動的読み込みにStackView
やLoader
をあまり使用していないためです。現在のFPSの結果は、ハードウェアの制約によってすでに限界に達しているようです。
コーヒーマシンのデモは比較的単純であり、より複雑なアプリケーションではさらに大きな改善が期待できるでしょう。