Qtブログ(日本語)

Qt 5.8.0 での QML のパフォーマンスの改善について

作成者: 鈴木 佑|Apr 5, 2017 1:38:53 AM

この記事は The Qt BlogQt QML Performance improvements in Qt 5.8.0 を翻訳したものです。
執筆: Alex Blasche, 2017年3月8日

Qt 5.8 では大幅な Qt QML のパフォーマンスの改善がなされました。数人のエンジニアが多くの時間を費やし、どこがどう遅いのか、どう改善できるのかを調べました。これは Qt QML を最初にリリースした時から常に継続していることで、今後もこれは続くでしょう。ある程度の検討を重ねた結果、実際にどういう作業が行われているかをわかりやすくすることにしました。この長期に渡るプロジェクトを通していくつものパフォーマンス関連のツールや社内外のエンジニアによるベンチマークに関するノウハウが蓄積されています。これにより複雑なアレコレを一般化することが可能になりました。

起動時間

Qt 5.6.2 と Qt 5.8.0 で、グラフィカルと非グラフィカルなベンチマークで起動時間を比較してみました。対象のプラットフォームは Windows と Ubuntu、macOS、iMX6 ボード(この中で唯一32bitの環境になります)です。起動時間は以下の Qt の環境で確認しました。

  • Qt 5.6.2
  • Qt 5.6.2 + 商用の Qt Quick Compiler (qmlcompiler)
  • Qt 5.8.0 + QML キャッシュなし
  • Qt 5.8.0 + QML キャッシュあり(初回起動時)
  • Qt 5.8.0 + QML キャッシュあり(2回目以降)

最後の二つでは、最初の起動時にキャッシュが生成され、それ以降はそのキャッシュが利用されるようになっています。アプリケーション自体に変更が無いという想定で実施しています。今回の比較に用いたのは Qt Quick Controls Gallery のサンプルアプリケーションになります。比較的規模が大きく、JavaScript のコード量も多めだという以外にはこれを選択した大きな理由はありません。以下が結果になります。

  • macOS と Ubuntu では、キャッシュの利用と qmlcompiler の利用は同じ結果になりました。
  • iMX6 ではキャッシュの利用は qmlcompiler に対して 60% の改善となりました。
  • Windows ではキャッシュ以外の部分でリグレッションが発生していました。詳細は QTBUG-59360 を参照してください。
  • 初回起動時のキャッシュの生成には時間がかかっています(10% から 180%)

QML のベンチマーク

上記の起動時間に関する調査により利用したアプリケーションについての詳細な内容が分かりましたが、次のアプリケーションはそうでもないかもしれません。さらに詳細なベンチマークをとってみました。QML ベンチマークは2つの分野に分けることができます。最初の分野は QML のバインディングのパフォーマンス(生成、異なる型の読み書き)で、2つ目の分野はグラフィックスの描画のパフォーマンスです。これで何がわかったでしょうか?

  • QML プロパティの読み書きはデスクトップでは 25% 高速化されており、iMX6 では 35% になりました。
  • 特にローエンドのハードウェアで最近の改善の恩恵が大きかったです。
  • いくつかの iMX6 のテストではリグレッションが発生していました。コード的には、特定の C++11 のアトミックの利用が(Qt 5.7 以降は C++11 が必須となっています)悪い結果となっていました。コンパイラのアップデートによりこれは改善されるかもしれません。

まとめ

これらの定期的な測定を10月に始めて以来、改善の度に新たな問題を発見してきています。これはパフォーマンス関連のテストをより短いサイクルで、もしくは自動化して実行する必要性を示唆しています。ベンチマークの結果 を共有しますので、是非確認してみてください。

現時点ではまだ調査が必要な様々な問題(例えば、Windows での起動時間や、各パフォーマンステストで見つかったリグレッションなど)があることをお伝えしておきます。コンパイラのアップデート以外にも、Qt QML にはさらに分析すべき様々な分野があることがわかっています。

Qt 5.8.0 では本当に様々な側面からの改善が成されました。5.8 以降もキャッシュの生成をコンパイル時に行うことやガベッジコレクターの改善などの計画が検討されています。今後もお楽しみに