このブログはQt Performance and Tools Update Part 1を翻訳したものです。
パフォーマンスの最適化は、リソースに制約のある環境でアプリケーションを動作させる場合に重要です。これは通常、組み込みの場合ですが、一部のデスクトップアプリケーションにおいてもリソースが不足する場合があるため、デスクトップでも重要性がない問題ではありません。
ここでのパフォーマンスとは、その目的を達成するためにアプリケーションを実行する能力であり、実際には通常、UIで十分なFPSを意味し、起動時間、メモリ消費、CPU / GPU負荷などの他の非機能要件を満たすことを意味します。
Qtのパフォーマンス面については多くの議論があるため、関連するいくつかの取り組みと我々の提供しているツールの要約を提供する良い機会だと考えました。これらを利用してアプリケーションのパフォーマンスを最適化したり、テストに適用することもできます。既存のパフォーマンスツールの改善だけでなく、新しいツールの追加やガイドラインの提供にも取り組んできましたので、最新の追加機能を見ていきましょう。この投稿は、パフォーマンスの最適化を支援し、この分野での当社の活動を紹介するものです。
Qtフレームワークは50以上のモジュールで構成されており、必要に応じてアプリケーションと一緒にデプロイするように簡単に選択できます。Qt6 の設定可能性の向上に取り組んできたので、不要な機能をより簡単に削除することができます。
Qt Configure Optionsは、開発者がアプリケーションを最適化してパフォーマンスと効率を向上させるためのコンセプトです。Qt Configure Optionsを使用すると、アプリケーションをより小さなパッケージで提供することができ、より小さなRAMフットプリントに収まり、より迅速に起動することができます。Qt Configureの「-ltcg」、「Link Time Code Generation」オプション(このブログ記事も参照)とともに、ランタイムパフォーマンスも向上します。
近い将来、このトピックに関する別のブログ記事にご期待ください。
アプリケーション トレース イベントについては、QML プロファイラーと私たちのイベント (Q_TRACE) に関連して、以前ブログで紹介しました: https://www.qt.io/blog/qtquick3d-qml-profiler-events
QML プロファイラーと私たちのイベント (Q_TRACE) を組み合わせたアプリケーション トレース イベントについては、以前ブログで紹介しました。
私たちはさらに多くのイベントを追加するためにこの作業を続けており、最新の側面、特に独自のイベントを使用する方法については、数週間以内に 別のブログ記事を公開する予定です。
アプリケーション トレース イベントは、トレースをサポートしていない OS でカーネルやデバッグ フレームを構築することなく、低レベルの C++ コードのトレース情報を見ることを可能にします。これは、トップレベルの QML または JavaScript から C++ まで、そしてカーネル空間までをトレースするフル スタック トレース を可能にします。これにより、たとえば、アプリケーションのパフォーマンスを測定し、それが CPU や I/O に拘束されているかどうか、または同じシステム上で実行されている他のアプリケーションの影響を受けているかどうかをチェックすることができます。
Qt 6.5 では、トレース イベント用に CTF (Common Trace Format Viewer) - サポートも追加されました。これは、LTTng でサポートされていない場合、たとえば Windows でも使用でき、システムの完全なビューを得ることができます。また、いくつかのRTOSでも動作します。trace-compassを使用してトレースを開いたり、babeltraceを使用してテキストに変換することができます。
LTTng ベースのトレースは、Qt がサポートを有効にしてビルドされている限り、Linux 上で有効にできます。
Qt Creator には、パフォーマンス関連のツールも多数用意されています。例えば QML Profiler は Qt Creator 内部のデバッグツールで、典型的なパフォーマンス問題の根本原因を見つけることができます。Qt Creator ツールの完全なリストはこちらをご覧ください:https://doc.qt.io/qtcreator/creator-analyze-mode.html
QML Profiler は QML や JavaScript のスタックトレースを提供します。 収集したデータは Qt Creator で別途表示することができます。
QMLプロファイリングとアプリケーショントレースイベントの主な違いは、アプリケーショントレースイベントがC++レベルのトレースもサポートしていることです。
QMLプロファイリングの詳細については、以下のリンクをご覧ください: https://doc.qt.io/qtcreator/creator-qml-performance-monitor.html
また、Qt Creator 12 以降の CMake ではプロファイラが利用できます。これにより、CMake がプロジェクトの設定に費やしている時間を確認できます: https://doc.qt.io/qtcreator/creator-how-to-profile-cmake-code.html
さらに、私たちが便利だと思った CPU 使用率を分析するツールがあります。
https://doc.qt.io/qtcreator/creator-cpu-usage-analyzer.html
Chrome Trace Eventsを使用したフルスタックトレースのトレース視覚化の詳細については、以下のQt Creatorドキュメントリンクも参照してください。これは、組み込みのtrace-viewerを使用して視覚化するのが難しい大きなトレースファイルを表示する場合に特に便利です:https://doc.qt.io/qtcreator/creator-ctf-visualizer.html
Qt Quick Compiler for QML と関連するパフォーマンス向上については、以前にもブログで紹介しました:
Qt Quick Compilerは、QMLをC++にコンパイルし、オプションでカスタム型の処理を最適化することで、QMLをインタプリタ実行した場合と比べて大幅にパフォーマンスを向上させます。典型的な使用例であるQObjectsを利用した非UIベンチマークアプリを使用すると、大幅な改善(上記リンクを参照)が見られます。
Qt 6.6とQt 6.7では、QObjectを扱い、型付けされた関数を呼び出すパフォーマンスが大幅に改善されました。
ここでの次のステップは、私たちの型推論を再び拡張できるように、コンパイラの型情報を再構築することです。
Qt Quick Ccompiler の詳細については、既存のドキュメントを参照してください: https://doc.qt.io/qt-6/qtqml-qtquick-compiler-tech.html
Qt for MCUは、数百kバイトのメモリに収まりながらQMLをサポートする完全なグラフィックスフレームワークおよびツールキットです。特に、処理能力とメモリが限られているマイクロコントローラを対象としています。ただし、MPUでも実行できます。Qt for MCUの詳細については、製品ページを参照してください: https://www.qt.io/product/develop-software-microcontrollers-mcu
ROMのフットプリントをさらに削減するための作業が進行中です。これは絶え間ない努力であり、Qt for MCUs 2.8 LTSでは、以前の2.5 LTSリリースと比較して、QMLから生成されるコードC ++の量を4〜10%削減することができました。
組み込みパフォーマンス評価アプリケーションは、組み込み 2D ユースケース向けの新しいアプリケーションであり、UI 要素を追加したときにハードウェアでパフォーマンスがどのように変化するかを確認するために拡張できる最小限の UI を提供します。fps、CPU負荷、および表示可能なメモリ消費量のログ出力を提供し、コマンドラインの使用もサポートしているため、継続的なテスト作業に使用できます。現在ベータ段階にあり、秋の後半に早期ユーザーに個別に提供できます。
パフォーマンスの測定は複雑な作業になる可能性があり、直接比較できないものを測定することになりがちです。例えば、Qt 6では、OpenGLに加えてVulkanのようなさまざまなバックエンドをより良くサポートするために、ソフトウェアアーキテクチャを変更してRHI APIを導入しました。RHI導入 によって、従来のQtアプリ開発と異なる部分が多少生じましたが、Qtとハードウェアおよび OS の関係は大きく変化しました。これにより、Qt 5 と Qt 6 の直接的な比較はそれほど簡単ではありません。
直接比較が難しい別の例として、ソフトウェアラスタライザー(QPainter)の特定の操作に対するマルチスレッドサポートが強化されたことが挙げられます。この強化によって複数のコアを使用すると、最初はCPU消費量が高くなります(ピーク)が、シングルコアモデルを使用する場合と比較して、最終的には進行が速くなります。
コンフィグレーションによる比較の難しさもあります。例えば、Yocto の設定は Qt 5 と Qt 6 で異なるため、Boot の Yocto を Qt 5 から Qt 6 にアップグレードし、例えば国際化に使用される ICU ライブラリを設定しないと、メモリが大幅に増加しますが、これはライブラリを再設定することで解決できます。
さらに、OSのバージョンが異なると、3rdパーティのライブラリとドライバーが直接比較するのが難しくなり、テストセットアップでこれらを考慮する必要があります。
デスクトップでのQt 5とQt 6の比較など、追加の測定作業が進行中です。これらの測定値の詳細は今後数週間以内に発表する予定ですが、重要なのはQtがどのように使用されているかであり、Qtは結果に大きな影響を与える可能性があります。
一般的に、Qt 6 はより多くの機能とコードを備えているため、多くのシナリオで Qt 5 よりも少し多くのメモリを消費する可能性がありますが、いくつかのプランとガイドラインがあれば、パフォーマンスに大きな違いはないはずです。Qt Quick CompilerとQt Liteの機能設定は、CPU / GPUの消費、メモリ使用率、および起動時間のパフォーマンスを向上させる追加の方法の例です。
リグレッションテストにはいくつかのツールを使用していますが、パフォーマンスの観点から重要なツールの1つはQmlBenchです:
https://code.qt.io/cgit/qt-labs/qmlbench.git/
QmlBenchは、Qt、QML、およびQtQuickを単独でではなく、スタック全体としてベンチマークするためのツールです。そのベンチマークは、Quick、QML、Gui、Coreの非常に大きな部分をカバーしており、その結果、Qtの全体的なパフォーマンスの適切な指標と見なすことができます。
私たちは、QmlBenchを使用して、さまざまなデスクトッププラットフォームと組み込みプラットフォームの両方で異なるQtバージョンをテストし、回帰の問題を検出しています。現在、組み込みハードウェアの対象範囲を新しいボードに拡大するとともに、テスト手順自体を強化してリグレッションをより適切に検出しています。
場合によっては、さまざまなシナリオで既存のアプリケーションをデバッグする必要がある場合があります。Qt Quick 3Dのための1つのオプションとして、パフォーマンス関連のデータを簡単に確認できるDebugView QML型があります。これは、アプリケーションの左上隅にダイアログを作成し、3D fps、同期、レンダリング時間、および詳細な統計(ドローコール、レンダリングパス、テクスチャ、シーンのアセットで使用されるメッシュ)を表示します。
これは、コードにQMLスニペットを追加することで有効にできます。
Qt パフォーマンス ガイドラインは Qt ドキュメントの中で少し散らばっていましたが、見つけやすいように 1 つの場所に集めました。ガイドラインは、個々のハードウェア ボードの性能を最大限に引き出すのに役立ってきました。Qt は、様々なことができるようにするために多くのベルやホイッスルを備えた包括的なフレームワークですが、うっかり最適化されていないソフトウェア構造を選択してしまう可能性があります。現在、ガイドライン文書のリストには以下が含まれています。
また、Qtによるパフォーマンス最適化に関する具体的なコード例を示すためのリファレンスアプリケーションの例も用意しています。さらに、Qt 5とQt 6の両方でQuick 3Dパフォーマンスベンチマークを行う既存のアプリケーションがあります:https://www.qt.io/blog/introducing-qtquick3d-benchmarking-application
このブログ記事の要点は、以下の通りです。