本文へスキップします。

本文へ

【全Qt】
【全・Qt】SRAロゴ
H1

技術記事:プロファイリングツール

技術記事

Qtアプリケーション開発に使える!プロファイリングツール

(掲載 2023年6月29日)

プロファイリング

この記事では、Qtアプリケーション開発で活用可能な、C/C++アプリケーションのプロファイリングの概要を説明します。 さらに、適切なツールを適切なタイミングで選択できるように、用途に応じたいくつかのプロファイリングツールをご紹介します。


プロファイリングの手順

実際のツールをご紹介する前に、プロファイリングの手順を見てみましょう。プロファイリングを適切に行うためのテクニックを身につけることは非常に重要です。より良くなることを期待して何かを変更し、コミットして、実際に改善されたかどうかを確認せずに帰ってしまうという罠を避けるためです。そのためにはまず、プロジェクトのパフォーマンスの観点から、何が重要かを見極めることが必要です。

CPU使用率でしょうか?アプリケーションがスリープや休止しているときにCPUがオフになっている時間でしょうか?メモリの割り当てでしょうか?バッテリーの使用量が問題なのでしょうか?それともフレームレートを改善したいのでしょうか?

これらの課題に対して、以下のような一連のステップが必要であると考えられます。

① まずは、プロジェクトにとってなにが重要で、何を測定したいのかを見極めます。

② 次に、測定を行うためのツールを選定します。ツールはさまざまなものが存在し、どのツールも測定可能な多数の項目をカバーしています。

③ ツールを選択したら、ベンチマークを作成する必要があります。これは、アプリケーション内で何かを測定するための信頼できる方法です。アプリケーションを起動して、ここをクリック→あそこをクリック→ファイルをロード→ダウンロードを待つ…といった操作を行う場合、3回続けて同じ測定値を取得することはできません。 単体テストなど、ある種の自動テストを作成する方がはるかに優れていますが、これは正確性ではなくベンチマークを目的としており、何を測定するか、どのように測定するかを決め、実際に確実に測定することが重要です。

④ コードに変更を加える前に、いずれかのツールを使用してベンチマークを実行し、ベンチマークを測定してベースラインを確立します。

⑤ ようやくコードを変更できます。前のステップまではコードを変更しないことに留意してください。変更後、結果を測定し、ベースラインと比較し、その変更が改善されたかどうかを判断します。このとき、ある指標が他の指標より優れている場合は少し面倒です。それで十分なのか、それとも解決策を改良すべきなのかを判断する必要があるためです。

そして、変更を加えてもう一度測定し、ステップ④まで繰り返し、プロファイリングし、ステップ⑤を繰り返し、また変更を加える、といった具合です。

使用するツール

パフォーマンスの測定

まずは、パフォーマンスの測定です。具体的にはCPUとCPU以外のパフォーマンスについて説明しましょう。

VTune

パフォーマンスを測定するには、Intel 製の VTuneを使用できます。これは非常に優れたユーザーインターフェイスを備えた強力なツールです。LinuxとWindowsの両方で利用でき、Intel System Studioの一部としてダウンロードした場合は無料です。(VTuneとして個別に探すのではなく、Intel System Studioツールスイートの一部として探してください。)Vtuneは商用利用であっても無料で使用できます。ただし、唯一の制限として、Intelハードウェアが必要です。つまり、AMD CPUや組込みボードを使用している場合のARMではVTuneを使用できません。その1つの制限を除けば、これは非常に優れたツールです。

Perf

パフォーマンスの測定に使用できるもう1つのツールは、Linuxカーネルの一部である Perfです。つまり、x86、ARM、PPCなどを含むLinuxカーネルのすべてのアーキテクチャをサポートします。残念ながら、Perf にはユーザーインターフェイスがありません。コマンドラインツールなので使いこなすには難易度が高いかもしれません。そこで、KDAB では、Perfによって行われる測定用のグラフィカル インターフェイスである Hotspot と呼ばれるツールを提供しています。

Hotspot はGitHub上にあり、フリーで使用できるオープンソースです。このツールは、アプリケーションが使用するCPU時間を監視し、その時間を誰が使用しているかを調べるなど、一般的なユースケースのほとんどをカバーしています。また、CPUがオフになっている時間、つまりアプリケーションがスリープしていたり、または何かが起こるのを待っている時間の測定もサポートしています。Hotspotのデモを見るにはここをクリックしてください。

メモリ割り当ての測定

前述したように、もう1つ測定したいのはメモリ割り当てです。メモリリークだけでなく、アプリケーション実行中のメモリ使用状況も測定します。

Valgrind Massif

アプリケーションが最後にすべてクリーンアップしている場合、大量のメモリ使用量がリークとして現れることはありません。したがって、メモリリークチェックツールは役に立ちません。ただし、アプリケーションの実行中にメモリの使用量が多すぎる場合は、メモリの割り当てが行われる場所を正確に特定できる別のツールを使用することをお勧めします。そのためのツールの1つがValgrind Massifです。このツールは非常にうまく機能しますが、非常に遅いのが難点です。

Heaptrack

もう1つのアプローチは、KDE の一部であるオープンソースツールのHeaptrackを使用することです。これはKDABのMilian Wolffによって開発されました。このツールは、アプリケーションの実行中に行われたすべてのメモリ割り当てを見つけて呼び出すことができます。そして、一時的な割り当て(メモリ領域が割り当てられ、その後すぐに解放されること)を含む割り当てのグラフを表示してくれます。

また、最適化のためにも活用できます。さまざまなメモリサイズに対して、小さいメモリサイズを割り当てることが多いか、大きいメモリ サイズを割り当てることが多いかを表示できます。そしてもちろん、すべての割り当てのバックトレースが表示されるので、アプリケーションのソフトウェアメモリをコードに関連付けて、どのコードがそれを実行しているかを見つけるのに役立ちます。そして速度はValgrind Massifよりもはるかに優れています。

HeaptrackがValgrindに勝るもう1つの機能は、実行中のプログラムにHeaptrackを接続できることです。これは、アプリケーションのセットアップ全体ではなく、1つの操作のみを測定したい場合に非常に便利です。また、ツールの実行間の差も表示できるので、前述のプロセスを適用する場合に非常に役立ちます。ベースラインを測定し、変更を加えて測定することができ、Heaptrackはその2つの差異のみを表示するため、変更を加えたときにどれだけ改善されたかを把握することができます。

Heaptrack のデモについては、このビデオをご覧ください。

更に詳しい情報について

実際のツールをご紹介する前に、プロファイリングの手順を見てみましょう。プロファイリングを適切に行これらすべてのツールの使用方法の詳細については、KDABのYoutubeチャンネルで公開されている動画Profiling and Debugging C/C++ Applicationsをご覧ください。また、動画ビデオの内容よりもさらに詳しく知りたい場合は、KDABにてC/C++アプリケーションのプロファイリングとデバッグトレーニングも提供しています。トレーニングにご興味ある方は、SRAの営業担当もしく問合せページにご相談いただくか、KDAB日本語ページより直接お問合せください。


出典:C/C++ Profiling Tools 【KDAB】
KDAB日本語トップページ