ロックと待機の解析は、アプリケーションで異なるコード要素の同期を待機している場所と利用可能な論理プロセッサーの使用率を示します。次のビューポイントを使用して、収集したコンカレンシー・データを解釈します。
[Hotspots] ビューポイントでは、CPU 時間を最も費やしているプログラムユニットを特定できます。
[Hotspots by CPU Usage (CPU 使用率別 hotspot)] ビューポイントでは、CPU 時間を最も費やしているプログラムユニットを特定し、CPU 時間が効率良く使用されたかどうか確認できます。
[Hotspots by Thread Concurrency (スレッドのコンカレンシー別 hotspot)] ビューポイントでは、アプリケーションの論理スレッドがシステムの CPU に効率良くスケジュールされたかどうか確認できます。
[Locks and Waits (ロックと待機)] ビューポイントでは、CPU コアが十分利用されずにスレッドが同期オブジェクト (ロック)、I/O、タイマーで長時間待機しているなど、CPU 時間が効率良く活用されていない箇所を特定できます。
ロックと待機の解析で提供されるパフォーマンス・データを解釈するには、次の操作を行います。
- パフォーマンス・ベースラインを定義します。
[Summary (サマリー)] ウィンドウまたはこの解析結果で提供されるアプリケーション・レベルのデータから確認します。最適化の前後の結果を比較するためのベースラインとして経過時間の値を使用します。
経過時間と指定した数の実行スレッドと利用可能な CPU の使用状況を表した [CPU Usage (CPU 使用率)] チャートと [Thread Concurrency (スレッドのコンカレンシー)] チャートを確認します。最も長いバーがインテル(R) VTune(TM) Amplifier XE で定義されている OK (許容範囲) または Ideal (理想) 範囲内にあるのが理想的です。
- アプリケーション中のロックと待機を特定します。
パフォーマンスに重大な影響を与える同期オブジェクトは、[Locks and Waits (ロックと待機)] ビューポイント の [Bottom-up (ボトムアップ)] ペインで確認できます。一概にはいえませんが、通常は、これといった特徴のないスレッドがまれにオブジェクトを長時間待機していることがあります。待機時間が長く、待機カウントの多いオブジェクト (特に、CPU 使用率/コンカレンシーが Poor (低) のもの) を重点的にチューニングすることを推奨します。
デフォルトでは、同期オブジェクトは待機時間でソートされ、 最もクリティカルな同期オブジェクトが最初に表示されます。[Wait Time (待機時間)] 列見出しで
ボタンをクリックすると、列を展開して CPU 使用率タイプごとの時間分布を確認できます。各使用率タイプの見出しを右クリックして [Set Column as Data of Interest (列を特定のデータに設定)] を選択すると、その列の値をほかのビューで計算 (例えば、[Call Stack (コールスタック)] ペインのスタックの割合) に使用できます。
以下の例では、Poor (低) 使用率が [Data of Interest (特定のデータ)] に設定され、この列でデータがソートされています。

待機時間が最も長い同期オブジェクト (バー形式の場合は赤いバーが最も長いもの) の待機時間をなくすか、最小限に抑えます。
- タイムラインを検証します。
[Bottom-up (ボトムアップ)] / [Top-down Tree (トップダウン・ツリー)] ウィンドウの下部にある [Timeline (タイムライン)] ペインは、アプリケーションのスレッドの動作とスレッドのコンカレンシー評価基準の変化を表示します。データを検証して、問題箇所を選択し、ポップアップ・メニュー・オプションを使用してその領域を拡大します。例えば、次の図では、コンカレンシー・レベルが低く、遷移の多発により多数の待機が発生していることが分かります。遷移している箇所をダブルクリックすると、[Source (ソース)] ビューに切り替わり、そのコード領域を検証することができます。それぞれの待機でアプリケーションが何をしていたかを調べるには、スレッドでデータをグループ化して、特定のスレッドに注目してみます。 次の例では、threadstartex スレッドに注目して、その関数で待機時間が長い箇所のソースコードを検証します。

- アルゴリズムの問題を特定します。
アプリケーションの呼び出しシーケンスに問題があることがあります。この場合、アプリケーションで関数を呼び出す方法を変更することで、パフォーマンスを向上できます。問題の可能性のある箇所を調べるには、次のような方法があります。
[Bottom-up (ボトムアップ)] ペインで hotspot 関数を右クリックして、[Highlight Selection in Top-down Tree Pane (トップダウン・ツリー・ペインで選択をハイライト)] を選択します。すると、[Top-down Tree (トップダウン・ツリー)] ペインを開いたときに、コールツリーでその hotspot 関数がハイライトされます。hotspot の呼び出し元と呼び出し先の合計時間とセルフ時間を検証して、それぞれの時間を最適化できるかどうか確認します。
[Call Stack (コールスタック)] ペインでは、[Bottom-up (ボトムアップ)] / [Top-down Tree (トップダウン・ツリー)] ペインで選択した同期オブジェクトのスタックのうち最も割合の高いものが表示されます。ナビゲーション・ボタン
を使用して、選択した同期オブジェクトを呼び出したスタックの表示を切り替えることができます。バーは、選択した同期オブジェクトで費やされた合計時間に対する現在表示されているスタックの割合を示しています。
[Call Stack (コールスタック)] ペインのドロップダウン・リストを使用して、異なるスタックのデータを表示することもできます。
- ソースを検証します。
最も時間を費やしている同期オブジェクトをダブルクリックして、[Source/Assembly (ソース/アセンブリー)] ウィンドウでコードを表示します。[Timeline (タイムライン)] で遷移している箇所をダブルクリックすると、その遷移のコールサイトが表示されます。 インテル(R) VTune(TM) Amplifier XE から直接コードエディターを開き、コードを編集できます。
- その他の解析タイプを試してみます。