アプレットのプロファイリング

概要

Curl® IDE には、Curl® 言語アプリケーションのパフォーマンスを解析するためのメカニズムが用意されています。Curl IDE のプロファイリング機能は、IDE のユーザー インターフェイスを使用するか、またはプロファイリング API の関数をソース コードに含めることによって使用できます。この機能は、Curl Pro/IDE でのみ利用できます。「Curl 及び Curl Pro 製品」を参照してください。

アプレットのプロファイリング

要約:
Curl プロファイリングは次の 2 ステップのプロセスから成り立っています。
  1. 実行中のアプレットのパフォーマンス データの収集。
  2. プロファイル ビューアおよび IDE エディタでデータを分析。
Curl アプレットをプロファイルするには、まずパフォーマンス データを収集する必要があります。データ収集はアプレットのコンテキスト メニューから開始および停止できます。ブラウザ ウィンドウで実行されているアプレットをコントロール+右クリックしてコンテキスト メニューにアクセスし、[プロファイリングの開始/停止] を選択します。プロファイリングを停止すると、IDE によって自動的にプロファイル ビューアが起動され、収集したパフォーマンス データ セットが表示されます。特にプロファイリング時間が数秒以上であったためにサンプル セットが大きくなった場合は、ビューアが画面に表示されるまで時間がかかる可能性があります。
このデータ セットは、後で使用できるようにプロファイル ビューアの [ファイル] メニューにある [保存] コマンドで保存できます。保存されているデータ セットを [ファイル] メニューから開くこともできます。
データを収集するときに、Curl プロファイラはアプレットの情報サンプルを取得してそれをメモリに格納します。これらのデータ サンプルに基づいて、プロファイル ビューアに時間とパーセンテージの統計情報が表示されます。
プロファイリングの 2 番目のステップは、データ セットの検査と分析です。プロファイル ビューアまたは IDE エディタ ウィンドウでデータを検査できます。 詳細については、「IDE プロファイル ビューアの UI」および「プロファイラ ソース ビュー」を参照してください。
プロファイリングの際に、アプレットをデバッグ可能またはデバッグ不可能の形式にするかどうかも考慮するべきです。 デバッグ可能なアプレットは、パフォーマンスデータとソースコード内の行番号をプロファイラがリンクするための追加情報を含んでいます。 この情報は、プロファイラ ソース ビュー を実行するために使用されます。ただし、この追加情報によるオーバーヘッドによって、 アプレットの実行により時間がかかることになり、不正確なパフォーマンス情報が導入される可能性もあります。
初回のプロファイリングはデバッグ可能なアプレットで実行するのが便利な方法です。 デバッグ可能なアプレットを使用することで、プロファイラの全機能を駆使して、 最も深刻なパフォーマンスの問題を識別することができます。 後に、アプレットをデバッグ不可能な形式に変換して、パフォーマンスを再分析し、 パフォーマンスを調整するためのより正確な結果を得ることもできます。

IDE プロファイル ビューアの UI

要約:
  • パフォーマンス データを分析するには、プロファイル ビューアを使用します。
  • ビューア ウィンドウには、相互関係のある情報が表示されるいくつかのペインがあります。これらのペインは、作業スタイルに合わせて構成できます。
  • プロファイル ビューアから簡単に IDE ソース エディタにアクセスできます。
プロファイル ビューアは、Curl プロファイラによって収集されたパフォーマンス データが表示されるウィンドウです。IDE エディタの [ツール] メニューからこのビューアを起動できます。プロファイル ビューア ウィンドウには 4 つのペインがあり、それぞれにデータのリストが含まれます。ビューアにはメニューとツール バーもあります。次の各セクションでは、プロファイル ビューア UI のこれらのコンポーネントについて説明します。

プロファイル ビューアのペイン

プロファイル ビューア ウィンドウのペインは、IDE のペインと同じように非表示にしたり、位置やサイズを変更したりできます。詳細については、「ウィンドウ構成の変更」を参照してください。
次の図は、既定のレイアウトを示しています。このレイアウトは、[表示] メニューの [既定に戻す] コマンドで復元できます。
Figure: プロファイル ビューアの既定レイアウト

[関数] ペイン

このペインには、データ サンプリング中にプロファイルされた関数のリストが表示されます。このリストには次の列が含まれます。
既定では、このペイン内のアイテムは [自己] 列の時間順にソートされます。
ツールバーの [列:][サンプルの表示:][Curl ランタイムの表示:] 及び [未知の関数の表示:] は、このペインのデータの表示を制御します。フィルタ メニューの [パッケージごとに色付け]アイテムは、情報がパッケージ毎に色づけされるかどうかを制御します。プロファイル ビューワ ツール バーフィルタ メニュー を参照してください。
[関数] ペインで関数をクリックすると、他のペインが更新され、それらのペインに選択した関数に関する詳細情報が表示されます。このリストの関数をダブルクリックすると、IDE ソース エディタにその関数を含むファイルが開き、プロファイリング情報も表示されます。詳細については、「プロファイラ ソース ビュー」を参照してください。

[スタック] ペイン

[スタック] ペインには、この関数までの呼び出しチェインの中で、費やされた時間が最も長いチェインが表示されます。関数は、複数の関数から呼び出される場合もあれば、他の複数の関数を呼び出す場合もあります。したがって、このペインでは、おおよそのプログラム動作のみ確認できます。また、アプリケーションが何に時間を費やしているのかを迅速に把握できます。このリストの関数をダブルクリックすると、[関数] ペインでその関数が選択されます。

[呼び出し元] ペイン

[関数] ペインで関数を選択すると、その関数を呼び出したすべての関数のリストが [呼び出し元] ペインに表示されます。このリストは、[呼び出し先の %] 列の降順にソートされます。[呼び出し先の %] 列には、選択された関数の合計実行時間のうち、[名前] 列の関数によって呼び出された場合の実行時間の占める割合が表示されます。このパーセンテージは、単純に [名前] 列内の関数が選択された関数を呼び出した頻度を示すものではありません。たとえば、ある関数が長い処理時間を要する大きいデータ構造を引数に指定して別の関数を呼び出した場合に、[呼び出し先の %] 列の値が高くなる可能性があります。
[呼び出し元] ペインで関数をダブルクリックすると、その関数は[関数] ペインで選択された状態になり、[呼び出し元] ペインの表示が新しく選択された関数を呼び出した関数のリストに変わります。

[呼び出し先] ペイン

[呼び出し先] ペインには、[関数] ペインで選択された関数から呼び出された関数のリストが表示されます。このリストの関数をダブルクリックすると、[関数] ペインでその関数が選択されます。
[呼び出し元の %] 列には、選択された関数のサンプルのうち、リスト内の各関数を呼び出した場合のサンプルの割合が表示されます。アイテム <self time> は、その関数自体に費やされた時間を示します。

プロファイル ビューアのメニュー

[ファイル] メニュー

[フィルタ] メニュー

[フィルタ] メニューを使用すると、収集したデータの一部を表示から除外できます。これにより、残りのデータの表示を見やすくすることができます。
フィルタには、2 つのアクション レベルがあります。1 つは、選択された関数に対してのみ機能するアクションです。もう 1 つは、関数を含むパッケージ全体に対して機能するアクションです。

[表示] メニュー

プロファイル ビューアのツール バー

機能説明
[ファイル] メニューの [開く] と同じです。
ファイルを再ロードします。
[関数] ペインに [自己][合計]、または [両方] を表示します。
パフォーマンス データを合計サンプル時間に対する割合秒数、または取得されたサンプル数 で表示します。
Curl ランタイムの関数を表示します。
Curl ランタイムの不明な関数を表示します。

プロファイラ ソース ビュー

要約:
デバッグ可能なアプレットをプロファイルする際に、IDE ソース エディタ内でプロファイリング データを表示できます。
IDE では、プロファイル ビューアだけでなく IDE ソース エディタでもプロファイリング データを直接表示できます。プロファイル データ ファイルを開くと、現在のプロファイル データ セット内のファイルのプロファイリング データが表示されます。プロファイリング データは、ブレークポイント パネルとソース コードの間の追加列に表示されます。
行番号のデータは、デバッグ可能なアプレットをプロファイルする場合のみに利用できます。 デバッグ不可能なアプレットは、パフォーマンスとソースコード内の行番号を連結する情報を提供していません。
この列には 2 つの項目が表示されます。各行について、その行がサンプル対象の関数の内部にあるかどうかが示されます。トップレベルのフォームのコンパイル方法により、この情報はプロシージャまたはメソッドの場合のみ正確です。また、現在のサンプル セットに基づいて、各サンプル対象行にかかった時間も表示されます。各サンプル対象行のデータ表示の背景には、費やされた時間の長さに従って濃淡が付けられます。最も時間のかかった行は濃い黄色、最も時間のかからなかった行は明るい黄色になります。濃淡の設定はオプション機能であり、コンテキスト メニューで無効にできます。
プロファイリング データは、サンプル セットの合計時間に対する割合または現在の関数に対する割合で表示できます。
列を右クリックすると、次のコンテキスト メニューが表示されます。
次の図は、ソース エディタ ペインを示しています。プロファイリング データが現在の関数に対する割合で表示され、コンテキスト メニューが表示されています。背景に濃淡を付けると、最も時間を消費する行を識別できます。
Figure: IDE ソース エディタ内のプロファイリング データ

パフォーマンス API

要約:
  • プロファイリング データは、ソース コードに関数呼び出しを追加することによって収集できます。
  • データは指定したファイルに格納されます。
どのコード領域を詳しく調べるか明確にわかっている場合は、パフォーマンス API の呼び出しをコードに追加できます。これらの関数は、アプレットが実行されるたびに自動的にパフォーマンス データを記録します。API はパッケージ CURL.IDE.PERFORMANCE にあり、次のプロシージャを含んでいます。

パフォーマンス データの使用

ブラウザのコンテキスト メニューまたはパフォーマンス API の呼び出しによってパフォーマンス データを収集したら、そのデータを IDE プロファイル ビューアで表示します。ビューアの機能を使用して、収集されたデータを調べたりコードのパフォーマンスを詳細に把握したりできます。
このセクションでは、小さいサンプル アプレットを使用して、IDE プロファイル ビューアでパフォーマンスを分析する方法を示します。すべてのスクリーン ショットはこの例に基づいています。この例は、d:\automated-build-temp\build\win32-atom\docs\default\examples\uguide\profiler.zip に含まれています。このアーカイブから適切なディレクトリにファイルを解凍してから、IDE で開いて実行します。「内容の充実したサンプル ファイル」を参照してください。
プロファイル ビューアには、選択した関数に費やされた時間が表示されます。IDE はこのような時間に基づくリソース コストを計算するときに、自己時間合計時間の両方を計算します。合計時間は、その関数とその関数から呼び出された関数に費やされた時間です。自己時間は、その関数だけに費やされた時間です。ほとんどの場合、最適化できないすべての関数をビューから削除したら、自己時間が考慮すべき最も重要な値になります。
注意: アプリケーションが関数を再帰的に呼び出す場合、関数 ペインの 合計 列はスタック上の関数のすべてのインスタンスの合計をレポートします。これは実際のパフォーマンスを反映しない数字をもたらす可能性があります。再帰的に呼び出される関数をプロファイルする必要がある場合は、戦略的に配置されたパフォーマンス API への呼び出しがもっとも有用な情報を提供するでしょう。
ビューアのツール バーにあるコントロールで合計時間、自己時間、または両方を選択できます。次の図は、[合計]時間と [自己] 時間の両方が表示された [関数] ペインを示しています。
Figure: 自己時間と合計時間

フィルタリング

フィルタリング機能を使用すると、全体のパフォーマンス サンプルのサブセットをプロファイル ビューアで表示できます。パフォーマンス データ サンプルには、自分のパフォーマンス問題に関連しない情報も含まれている場合があります。[除外][フォーカス]、および[非表示] フィルタを使用すると、サンプル内の最も関連性のあるデータを選択できます。これらのすべてのフィルタでは、選択された関数または選択された関数を含むパッケージ全体をフィルタできます。
フィルタを適用するには、[フィルタ] メニュー、またはプロファイル ビューア ウィンドウのどこでも使用できる右クリックのコンテキスト メニューを使用します。

非表示

[非表示] フィルタは、指定されたサンプルをレポートから削除し、非表示の関数に費やされた時間をその関数を呼び出した関数の属性にします。このフィルタは、パッケージの構造を無視してそのオーバーヘッドを記録する場合に役立つ方法です。
また、Curl ランタイムの関数を非表示にしたり表示したりすることもできます。Curl ランタイムの操作にかかる時間については、短縮できないので、考慮する必要はありません。ただし、コードにある程度のオーバーヘッドがかかることに注意してください。既定では、プロファイル ビューアは Curl ランタイムの関数を非表示にします。
次の図は、BUSY-WORK パッケージを非表示にするようにフィルタされたサンプル データを示しています。time-waster-2 の時間の値が増えていることに注意してください。time-waster-2 関数は、BUSY-WORK パッケージの lazy を呼び出します。呼び出された関数は、BUSY-WORK パッケージの他のすべての関数を呼び出します。したがって、BUSY-WORK を非表示にすると、BUSY-WORK 内の関数に費やされたすべての時間が time-waster-2 の属性になります。
Figure: BUSY-WORK を非表示にする

除外

[除外] フィルタは、サンプル データを、表示とパフォーマンス統計情報を生成する計算から除外します。このフィルタは、一部のコードのオーバーヘッドを無視する場合に役立ちます。たとえば、後で改良する予定があるルーチンまたはそれ以上改良できないルーチンを無視することが必要になる場合があります。そのような関数をプロファイル ビューアの表示から除外すると、それらの関数にかかる時間を考慮する必要がなくなります。
次の図は、BUSY-WORK パッケージを除外するようにフィルタされたサンプル データを示しています。残りの関数の時間がフィルタされる前のデータから変わっていないことに注意してください。データをサンプル セットから削除したたため、パーセンテージの値が変わります。
Figure: BUSY-WORK の除外

フォーカス

[フォーカス] フィルタは、[除外] フィルタの反対です。[フォーカス] フィルタは、現在選択されているサンプル以外のすべてのサンプルを削除します。フォーカスされた関数の上のスタック フレームも無視されます。
[フォーカス] フィルタを使用すると、大きいサンプルの特定部分にすばやく表示を絞り込むことができます。
次の図は、BUSY-WORK パッケージにフォーカスが設定されたサンプル データ セットを示しています。
Figure: WASTE-TIME にフォーカスを設定する

ペイン間の対話

4 つのプロファイル ビューア ペインには、関連するデータ セットが表示されます。[関数] ペインで関数を選択すると、その関数に関連する情報が他の 3 つのペインに表示されます。次の図では、time-waster-1 関数が選択されています。[スタック] ペインには、time-waster-1 までの最もコストのかかるパスが表示されます。他の 2 つのペインでは、その関数が time-waster-3waste-time から呼び出され、その関数自体は他の関数を呼び出さないことが示されます。
Figure: 関数の選択
この情報に基づいて、time-waster-3 をさらに詳しく調べることが必要になる場合もあります。この単純な例では、[関数] ペインで簡単にこの関数を見つけられます。データ サンプルが大きく複雑な場合は、呼び出し関数が見つかりにくくなる可能性があります。他のペインに表示されている関数名をダブルクリックして、その関数を [関数] ペインで選択したり、他のペインの表示を調整したりできます。
次の例は、time-waster-3 をダブルクリックした後のプロファイル ビューアを示しています。
Figure: 関数の選択
[関数] ペイン内の関数を関数名、パッケージ、またはファイル名でソートすると、特定の関数が見つかりやすくなります。列の見出しをクリックして、その列の値でペイン内のデータをソートできます。