Show page source of パフォーマンス解析ツール「VTune」でアプリケーションを高速化_p2 #64259

[[PageNavi(NavigationList)]]



==== VTuneのインストール ====


 今回は、VTuneの国内代理店であるエクセルソフトのWebサイトからダウンロードできる[http://www.xlsoft.com/jp/products/intel/download.html?sfwiki 体験版]を利用して調査を行った。使用したのはWindows版VTune 9.1で、30日間の期限付きではあるが製品版のすべての機能が利用可能だ。体験版のダウンロードにはメールアドレス等の入力が必要だが、ここで登録したメールアドレス宛に体験版のシリアル番号およびライセンスファイルが送られてくるので、有効なメールアドレスを入力しよう。


 ダウンロードしたVTune体験版のインストーラを実行するとインストールウィザードが表示されるので、指示に従ってインストールを行う。インストールにはシリアル番号、もしくはライセンスファイルの指定が求められるので、登録したメールアドレスに送られてきたシリアル番号を入力しよう('''図2''')。なお、シリアル番号での認証にはインターネット接続が必要なので、もしインターネット接続できない環境でインストールを行う場合は、メールに添付されているライセンスファイルを適当なフォルダに保存し、「Provide a license file」を選択してそのファイルを選択しよう。
[[Thumb(feb92ae7d50e8961bcf270ebf0e9fc9b.png, caption=図2 VTuneのインストールにはライセンス認証が求められる)]]



 また、VTuneにはVisual Studio 2005/2008からVTuneの機能を呼び出せる統合機能もあるが、Windows Vista環境ではVisual Studio 2005からVTuneのCounter Monitor機能を利用する場合にエラーが発生する場合がある。また、Visual Studio 2008との統合については対応していないので注意してほしい。インストーラのデフォルト設定では「Visual Studio 2008 integration」機能はインストールされないようになっているので、その設定のままインストールを進めよう('''図3''')。もしこちらをインストールしてしまうとVisual Studioの起動時にエラーが発生するようになってしまうので注意してほしい。
[[Thumb(495d8ce9004dc67a153295dfbdc0c2d3.png, caption=図3 インストールするコンポーネントで「MS* Visual Studio* 2008 integration」は選択しない)]]


==== Call Graph機能でボトルネックとなる関数を調べる ====


 まずはVTuneの「Call Graph」機能を使用し、ソースコード中のどの関数がボトルネックになっているのかを調査してみよう。Call Graph機能は関数単位でプログラムの挙動を調査するもので、次のような統計情報を取得できる。
 * それぞれの関数が何回呼ばれているか
 * それぞれの関数内がどれだけの時間実行されているか
 * ある関数がどの関数を何回呼んでいるか
 * ある関数がどの関数から何回呼ばれているか



 VTuneを起動するとまずは「Easy Start」画面が表示されるので、ここで「Quick Performance Analysis Wizard」を選択しよう('''図4''')。すると「Quick Performance Analysis(QPA)」画面が表示されるので、「Application to Launch:」で起動したいプログラムを指定する('''図5''')。また、プログラムに渡す引数は「Command Line Arguments:」で指定できる。今回はCall Graphでの解析を行うので「Collect call graph data」にチェックを入れ、「Go」をクリックすると指定したプログラムが起動され、調査が行われる。
[[Thumb(1a3d9db6960e63a969a17d5561a09bfc.png, caption=図4 VTune起動直後に表示される「Easy Start」画面)]]

[[Thumb(ef3e2dd2c4db22990a020f695a0c11d0.png, caption=図5 Quick Performance Analysis(QPA)画面で調査対象や引数を指定する)]]



 プログラムが終了すると、自動的にデータの収集と解析が行われ、画面の上ペインに呼び出された関数一覧が、下ペインに関数の呼び出し関係をグラフ化したCall Graphが表示される('''図6''')。
[[Thumb(6234d0551d58f6f98cc4ea4648d9259d.png, caption=図6 convert.exeのCall Graph)]]



 上ペインの関数一覧では、関数が含まれるモジュール(実行ファイルやDLLなど)、実行したスレッド、呼び出された回数などが関数名とともに一覧表示される。ここで「Calls」が呼び出された回数、「Total Time」はその関数が消費された時間を示している。ここで注目すべきなのが、「Self Time」項目である。このSelf Time項目は、ソースコード中でその関数内に記述されている処理がどれだけ時間を使っているか、ということを示すものだ。


 たとえば今回の例の場合、「Self Time」項目を見ることでCORE_RL_magick_.dllというモジュール内の「!BlurImageChannel」という関数が、プログラムが実行時間(実時間ではなく、CPUのサイクル単位で表示される点に注意)62,815,976単位のうち、55,997,261単位を占めているということが分かる。つまり、この関数が今回の処理の「ホットスポット」(プログラムの実行時間の大部分を占めるポイント)となっているわけだ。


 さて、プログラムのパフォーマンスを改善するにはこのホットスポットを高速化すれば良いのだが、Call Graphでは「どの関数が時間を消費しているか」というのを調べることはできるものの、関数内のどのコードが問題なのか、またなぜ問題なのか、ということまでは分からない。そこで、続いてはプログラムの挙動を詳細に調べられるサンプリング機能を利用して、ソースコード中で問題となっている部分を特定してみよう。


[[PageNavi(NavigationList)]]