演習 1.3: パフォーマンス・ボトルネックの特定
演習 1.3 を始める前に、『演習 1.2 パフォーマンス・データとカバレッジ・データの収集』を終了しておく必要があります。
パフォーマンス・ボトルネックは、コード内で処理がスローダウンまた
は停止している領域のことです。ここでは、「パフォーマンス・コール・グラフ」ビューを
使用して、ソート・プログラム内のボトルネックを識別する手順で
行います。
注: 行レベルのカバレッジ・データを収集するオーバーヘッドは
、ユーザーの収集するパフォーマンス・データを変更する可能性があります。ここに記述されている結果と同様の結果が得られ
ない場合は、プロファイル作成を 1 度実行してパフォーマンス
・データを収集し、もう 1 度プロファイル作成を実行してカバ
レッジ・データを収集します。ご使用のプログラムのプロファイルを作成する場合には、このことを覚えておいてください。
ボトルネックを検出するには、以下を実行します:
- プロファイル・モニターで「実行時間分析」プロファイル・リソース
を右クリックし、次に「アプリケーションから開く」>「パフォーマンス
・コール・グラフ」をクリックします。
「パフォーマンス・コール・グラフ」ビューには、
デフォルトで次の情報が表示されます:
- プロファイルの実行で時間のかかる上位 20 ノード
および、全実行にかかった全累積時間を表示する「プロセス」ノード。今回の場合は、
状況表示行の可視統計によると、ノードは合計で 17 個のみなので
、17 個すべてが表示されています。 「ノード」 は、
メソッド、プロセス、またはスレッドのいずれかを表します。
- プロファイルを実行している間のプログラムの動的な呼び出し構造が、
ノードをつなぐ接続線 (弧) で示されます。
太い線であれば、より時間のかかる呼び出し経路であることを示します。
ヒント: ノードを右クリックするとメニューが表示され、
そのメニューから、ノードとその子孫 (サブツリー) に焦点を
当てて表示したり、他の方法で表示を操作したりすることができます。
これらのメニュー・コマンドを使用することで、小さなアプリケーション
でも大量に収集されるデータを単純化することができます。
- グラフの上部に位置する「強調表示」フィールドで
、「ルートの最大パス」が選択されているこ
とに注目してください。
「ルートの最大パス」の強調表示は、
現在実行されているアプリケーションで、最も時間がかかる呼び出し経路
を 1 つ示します。
具体的には、コール・グラフの表示が次の方法で変更されます。
- プログラム内で最も時間の掛かったノードが選択されます。この例では、
このノードはクラス Sort 内のメソッド quick です。
- 選択されたノードから Process ノードまでの呼び出し経路が強調表示されます。
これは全実行の合計時間を表します。
- コール・グラフには、バブル・ソート・アルゴリズムを
表す bsort メソッドもあることに注目してください。線の太さから
判断して、この実行処理では qsort よりも bsort のほうが
パフォーマンスが良いことが分かります。
更なるパフォーマンス情報の取得
プラットフォームにおける「パフォーマンス・コール・グラフ」ビューと
その他のビューの両方から、アプリケーションのパフォーマンスに関する更なる詳細情報を入手することができます。
更なるパフォーマンス・データを取得する場合は、次の手順に従ってください。
- Sort.quick がどのように実行されているかを把握するために、
カーソルを Sort.quick ノードの上に置く。
ツールチップがメソッドの統計と共に表示されます。このメソッドは
多くの呼び出しを行うことに注目してください。
- メソッドに関するデータを詳細なグラフィックで表示するために、
ノードをダブルクリックします。「メソッド詳細」ビューが開きます。
- 「メソッド詳細」ビューで、
「呼び出し元」ペインを参照します。
このメソッドが Sort.Qsort から呼び出されるのは 1 回だけですが、
このメソッド自身が自分を何千回も呼び出すことに注目してください。
これ自体には特に問題はありません。通常、クイック・ソートは
大量の再帰処理を行います。
ただし、呼び出しに掛かる時間が比較的長い場合には、
問題が生じている可能性があります。
- すべてのメソッドについて、ソート可能なリストを調べるには、次の手順に従ってください。
- 「実行時間分析」プロファイル・リソースを右クリックし、「アプリケーションから開く」 > 「実行統計 (Execution Statistics)」 を選択します。
- 「実行統計 (Execution Statistics)」ビューで、「メソッド・レベル情報」ボタン (
) をクリックします。

- カラム・ヘッダー「基本時間」をクリックすると、現在の実行で
各メソッドにかかった時間の順で、メソッドをソートします。
quick の方がバブル・ソート・メソッ
ド bsort よりも大幅に時間がかかることが分かります。

これで、quick メソッドが予想以上に
時間がかかるということが確認されました。
また、「パフォーマンス・コール・グラフ」ビューと
「メソッド詳細」ビューからパフォーマンス情報を取得する方法についても紹介しました。
この情報は、コードを検査して変更を加える必要がある場所を特定する場合に役立ちます。
しかし、コードを検査する前に、そのコード内に実行され
なかったメソッドがなかったかを把握しておくことも必要です。
この検査から、アプリケーションのスコープがよく分かり、またこの
プログラムに含まれている可能性がある代替パスがあるかどうかも分かります。
これで、『演習 1.4: コード・カバレッジの検査』へ進む準備ができました。
ここでは実行されていないメソッドや代替パスがないか判別することができます。