(57)【特許請求の範囲】
【請求項１】
１つ又は複数のメソッドを含むソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段と、
前記ステートメント特定手段によって特定されたステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段と、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記プローブが挿入されたステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段と、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段と、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段と、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段と、を備え、
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする、プログラムプロファイリング装置。
【請求項２】
前記ソースプログラムを構成するメソッドのうち、前記プローブの挿入対象とするメソッドの識別情報を記憶するプローブ挿入対象メソッド記憶手段をさらに備え、
前記プローブ挿入手段は、前記プローブ挿入対象メソッド記憶手段に識別情報が記憶されているメソッドに含まれる前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする、請求項１に記載のプログラムプロファイリング装置。
【請求項３】
前記プローブ挿入手段で処理の前後にプローブを挿入するステートメントがブロックを有している場合、該ブロックの処理の前に、該ブロックの処理時間を計測するためのブロック用プローブを挿入する、ブロック用プローブ挿入手段と、
前記プローブ挿入手段と前記ブロック用プローブ挿入手段とによってプローブとブロック用プローブとが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記ブロック用プローブを挿入したブロックの処理が開始する度に、該ブロックの開始を表す情報とそのときの時刻と該ブロックの処理が属するスレッドの識別情報とを対応付けて記憶するブロック情報記憶手段と、
前記ステートメント情報記憶手段と前記ブロック情報記憶手段とに記憶されている情報に基づいて、ブロックの処理時間を算出するブロック処理時間算出手段と、をさらに備え、
前記処理時間表示手段は、前記ブロック処理時間算出手段で算出したブロックの処理時間を表示する、
ことを特徴とする、請求項１又は２に記載のプログラムプロファイリング装置。
【請求項４】
前記ステートメント情報記憶手段と前記ブロック情報記憶手段に記憶されている情報とに基づいて、前記ブロックを有するステートメントの処理時間から該ブロックの処理時間を除いた処理時間を該ステートメントの内部処理時間として算出する、内部処理時間算出手段をさらに備え、
前記処理時間表示手段は、前記内部処理時間算出手段で算出したステートメントの内部処理時間を表示する、
ことを特徴とする、請求項３に記載のプログラムプロファイリング装置。
【請求項５】
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定ステップと、
前記ステートメント特定ステップで特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入ステップと、
前記プローブ挿入ステップによってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入ステップでプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶ステップと、
前記ステートメント情報記憶ステップによって記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出ステップと、
前記ステートメント処理時間算出ステップで算出したステートメントの処理時間を表示する処理時間表示ステップと、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶ステップと、を備え、
前記プローブ挿入ステップでは、前記ステートメント特定ステップで特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶ステップによって記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とするプログラムプロファイリング方法。
【請求項６】
コンピュータを、
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段、
前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入手段でプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段、
として機能させるプログラムであって、
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ボトルネックとなるメソッドの処理時間等を、ステートメント単位で詳細に計測することができるプログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラムに関する。
【背景技術】
【０００２】
複数のメソッドで構成されたプログラムの処理性能の改善のために、プログラム全体の性能の低下に大きな影響を与える（ボトルネックとなる）メソッドを特定する必要がある。そのため、メソッドの処理時間を計測するなどの処理が行われている。このような一連の処理はプロファイリングと呼ばれている。
【０００３】
例えば、特許文献１は、ソースプログラムや目的プログラムを加工し、計測対象とするメソッドの前後にプローブを挿入し、このプローブの処理によってプロファイリングを行う技術を開示している。
また、特許文献２は、メソッド間の呼出関係をログへ出力するための技術を開示している
【特許文献１】特開２００４−９４３７４号公報
【特許文献２】特開２００４−２５９１５４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
しかし、特許文献１および特許文献２で開示されている技術は、メソッド毎にメソッドの処理時間等を計測するにすぎず、メソッド内のステートメントの処理毎に処理時間等を計測することはできない。そのため、ボトルネックとなるメソッドを特定できても、特定したメソッド内のどの部分が性能低下の原因となっているのかを判別することはできない。
【０００５】
本発明は、上記実状に鑑みてなされたものであり、メソッド内をステートメントの処理単位でプロファイリングをすることができるプロファイリング装置等を提供することを目的とする。
【課題を解決するための手段】
【０００６】
上記目的を達成するため、本発明の第１の観点に係るプロファイリング装置は、
１つ又は複数のメソッドを含むソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段と、
前記ステートメント特定手段によって特定されたステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段と、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記プローブが挿入されたステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段と、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段と、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段と、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段と、を備え、
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
【０００７】
前記ソースプログラムを構成するメソッドのうち、前記プローブの挿入対象とするメソッドの識別情報を記憶するプローブ挿入対象メソッド記憶手段をさらに備え、
前記プローブ挿入手段は、前記プローブ挿入対象メソッド記憶手段に識別情報が記憶されているメソッドに含まれる前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入してもよい。
【０００９】
前記プローブ挿入手段で処理の前後にプローブを挿入するステートメントがブロックを有している場合、該ブロックの処理の前に、該ブロックの処理時間を計測するためのブロック用プローブを挿入する、ブロック用プローブ挿入手段と、
前記プローブ挿入手段と前記ブロック用プローブ挿入手段とによってプローブとブロック用プローブとが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記ブロック用プローブを挿入したブロックの処理が開始する度に、該ブロックの開始を表す情報とそのときの時刻と該ブロックの処理が属するスレッドの識別情報とを対応付けて記憶するブロック情報記憶手段と、
前記ステートメント情報記憶手段と前記ブロック情報記憶手段とに記憶されている情報に基づいて、ブロックの処理時間を算出するブロック処理時間算出手段と、をさらに備え、
前記処理時間表示手段は、前記ブロック処理時間算出手段で算出したブロックの処理時間を表示してもよい。
【００１０】
前記ステートメント情報記憶手段と前記ブロック情報記憶手段に記憶されている情報とに基づいて、前記ブロックを有するステートメントの処理時間から該ブロックの処理時間を除いた処理時間を該ステートメントの内部処理時間として算出する、内部処理時間算出手段をさらに備え、
前記処理時間表示手段は、前記内部処理時間算出手段で算出したステートメントの内部処理時間を表示してもよい。
【００１１】
上記目的を達成するため、本発明の第２の観点に係るプログラムプロファイリング方法は、
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定ステップと、
前記ステートメント特定ステップで特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入ステップと、
前記プローブ挿入ステップによってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入ステップでプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶ステップと、
前記ステートメント情報記憶ステップによって記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出ステップと、
前記ステートメント処理時間算出ステップで算出したステートメントの処理時間を表示する処理時間表示ステップと、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶ステップと、を備え、
前記プローブ挿入ステップでは、前記ステートメント特定ステップで特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶ステップによって記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
【００１２】
上記目的を達成するため、本発明の第３の観点に係るプログラムは、
コンピュータを、
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段、
前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入手段でプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段、
として機能させるプログラムであって、
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
【発明の効果】
【００１３】
本発明によれば、メソッド内のステートメント毎に埋め込まれたプローブを実行することにより、メソッドをステートメントの処理単位でプロファイリングをすることが可能となる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明の実施形態に係るプログラムプロファイリング装置について、図面を参照して説明する。
プログラムプロファイリング装置１は、図１に示すように、通信部１１と、入力部１２と、出力部１３と、記憶部１４と、入出力Ｉ／Ｆ部１５と、制御部１６と、を備え、各部はバス１７を介して互いに接続されている。
【００１５】
通信部１１は、通信ネットワーク２を介して、ネットワーク上の情報処理装置等と通信を行うものであり、通信インタフェース等を備える。例えば、通信部１１が、プロファイリングの対象となるソースプログラムを受信して取り込む。
【００１６】
なお、本実施形態でプロファイリングの対象とするソースプログラムの言語はＪＡＶＡ（登録商標）とする。また、このソースプログラムは、１つ以上のクラスから構成され、各クラスは１つ以上のメソッドを備えているものとする。
また、メソッドは１つ以上のステートメントから構成されているものとする。また、ステートメントは、１つ又は複数の処理単位（ブロック）から構成されている場合もある。例えば、条件分岐処理を制御するステートメント「ｉｆ」では、分岐条件毎に複数のブロックを有する場合がある。
【００１７】
入力部１２は、キーボードやマウスなどから構成され、プログラムプロファイリング装置１に様々な情報や指示を入力する。
【００１８】
出力部１３は、ディスプレイ等の表示装置から構成され、様々な情報を出力する。例えば、出力部１３は、後述するプロファイリング処理において、メソッドのステートメント毎の処理時間を一覧表示した画面等を表示する。
【００１９】
記憶部１４は、ハードディスク等から構成され、様々な情報やプログラム等を記憶する。例えば、記憶部１４は、後述するプロファイリング処理を行う前に、予め、通信部１１等を介して取り込んだソースプログラムを記憶しておく。
また、記憶部１４は、図２に示すように、プローブ挿入対象メソッド記憶部１４１と、プローブ挿入対象ステートメント記憶部１４２と、ステートメント構文情報記憶部１４３と、ステートメント詳細性能ログ記憶部１４４と、を備える。
【００２０】
プローブ挿入対象メソッド記憶部１４１は図３に示すように、計測用のプローブを挿入するメソッドを特定する情報（クラス名とメソッド名と、引数の型と、戻り値の型）を記憶する。
【００２１】
プローブ挿入対象ステートメント記憶部１４２は、図４に示すように、ステートメントの種類（カテゴリ）毎に、該メソッドをプローブ挿入の対象とするか否かを示す情報（プローブ挿入可否フラグ）を記憶する。
【００２２】
ステートメント構文情報記憶部１４３は、図５に示すように、プローブが挿入されたステートメント／ブロック毎に、ステートメント／ブロック番号と、親ステートメント／ブロック番号と、種類と、ソースプログラム名と、開始位置情報と、終了位置情報とを記憶する。
【００２３】
ステートメント／ブロック番号はプローブが挿入されたステートメント／ブロックに付与されるユニークな番号である。
親ステートメント／ブロック番号は、当該ステートメント／ブロックが別のステートメント／ブロックから実行される場合、その実行元のステートメント／ブロックのステートメント／ブロック番号である。
種類（カテゴリ）は、当該ステートメント／ブロックが属する種類（カテゴリ）を表す情報である。
ソースプログラム名は、当該ステートメント／ブロックを含むソースプログラムの識別情報（プログラム名）である。
開始位置情報は、当該ステートメント／ブロックのソースプログラム内での開始位置を、バイト数および行番号とで表した情報である。
終了位置情報は、当該ステートメント／ブロックのソースプログラム内での終了位置を、バイト数および行番号とで表した情報である。
【００２４】
ステートメント詳細性能ログ記憶部１４４は、プロファイリングの結果を格納する。
ステートメント詳細性能ログ記憶部１４４は、図６に示すように、メソッド／ブロックを処理する度に、ログＩＤと、処理が実行された時刻（コンピュータあるいはプログラム固有の時刻でも、現在日時等でもよい）と、処理が属するスレッドの識別情報（スレッド名）と、ステートメント番号と、種類情報とを記憶する。
なお、この種類情報は、実行されたメソッドの処理の開始／終了、又は実行されたブロックの開始を示す情報である。
【００２５】
図１に戻り、入出力Ｉ／Ｆ部１５は、入出力機器３を接続するためのインタフェースである。例えば、プロファイリング対象となるソースプログラム等を、通信部１１ではなく、入出力Ｉ／Ｆ部１５を介して、ＣＤ−ＲＯＭドライブ等の入出力機器３から取り込むこともできる。
【００２６】
制御部１６は、データの演算処理を行うと共に、バス１７を介して通信部１１、入力部１２、出力部１３、記憶部１４、入出力Ｉ／Ｆ部１５を制御するものであり、ＣＰＵ（Central Processing Unit）１６１、ＲＯＭ（Read Only Memory）１６２、ＲＡＭ（Random Access  Memory）１６３等を備える。制御部１６における演算処理及び制御処理は、具体的には、ＣＰＵ１６１が、ＲＡＭ１６３を作業領域として使用して各種データを一時的に記憶させながら、ＲＯＭ１６２に記憶されている制御プログラムを実行することにより行われる。
【００２７】
制御部１６が、ＲＯＭ１６２や記憶部１４に記憶されている制御プログラムに従って上記各部を制御することにより、プログラムプロファイリング装置１の後述するプロファイリング処理等が行われる。
また、制御部１６は、タイマ、例えば、ソフトウェアタイマを備える。このタイマにより、制御部１６は、後述するプロファイリング処理で、ステートメントの処理の開始・終了時刻等を取得する。
【００２８】
プログラムプロファイリング装置１は、機能的には、図７に示すように、プローブ挿入部２１と、目的プログラム生成部２２と、プログラム実行部２３と、計測部２４と、ステートメント情報集計部２５と、ステートメント情報表示部２６とを備える。なお、これらの各構成要素は、図１に示した制御部１６が、同じく図１に示した通信部１１、入力部１２、出力部１３、記憶部１４、又は入出力Ｉ／Ｆ部１５を制御することにより、実現する。
【００２９】
プローブ挿入部２１は、プローブ挿入対象メソッド記憶部１４１で挿入対象であると設定されているメソッドに含まれるステートメントを特定する。そして、プローブ挿入部２１は、特定したステートメントで、プローブ挿入対象ステートメント記憶部１４２でカテゴリが挿入対象であると設定されているステートメントに対して、計測用のプローブを挿入する。
また、プローブ挿入部２１は、プローブを挿入したステートメントを、ステートメント構文情報記憶部１４３に登録する。
【００３０】
目的プログラム生成部２２は、プローブが挿入されたソースプログラムから目的プログラムを生成する処理（コンパイル）を行う。この処理は、Sun Microsystems社のＪＤＫ（Java Development Kit）が提供するＪＡＶＡ（登録商標）のコンパイラ等を利用して行えばよい。
【００３１】
プログラム実行部２３は、目的プログラム生成部２２で作成された目的プログラムを実行する。
【００３２】
計測部２４は、プログラム実行部２３によって実行された目的プログラムの処理に関する情報（処理開始時間等）を計測し、計測結果をステートメント詳細性能ログ記憶部１４４に格納する。なお、この計測は、ステートメントに含まれるステートメント／ブロックが実行される度に実施される。
【００３３】
ステートメント情報集計部２５は、ステートメント構文情報記憶部１４３およびステートメント詳細性能ログ記憶部１４４に記憶されている情報から、ステートメント／ブロック毎の処理時間や、ステートメントの内部処理時間等を集計する。
このステートメントの内部処理時間とは、ステートメントの処理時間から、当該ステートメントが含むブロックの処理時間を除いた時間を意味する。
【００３４】
ステートメント情報表示部２６は、ステートメント情報集計部２５が集計した情報、例えば、ステートメント毎の処理時間等を表示する。
【００３５】
続いて、プログラムプロファイリング装置１で、プログラムをプロファイリングする処理について、概略を説明する。
【００３６】
なお、前提として、プロファイリングの対象となるソースプログラムは、記憶部１４に記憶されているものとする。
また、予め、特開２００４−９４３７４号公報に開示されている技術等を用いて、目的プログラムを実行した際のメソッド毎の処理時間の計測が行われ、ボトルネックとなるメソッドが特定されているものとする。そして、このボトルネックとして特定されたメソッドは、ユーザの準備作業等により、プローブ挿入対象メソッド記憶部１４１に登録されているものとする。
また、どのカテゴリに属するステートメントをプロファイリングの対象とするのかを示す情報も、ユーザの準備作業等により、プローブ挿入対象ステートメント記憶部１４２に予め記憶されているものとする。  
【００３７】
ユーザから、ソースプログラムをコンパイルするための指示入力が入力部１２よりなされ、その入力情報が制御部１６に送信されると、目的プログラムを作成するためのコンパイル処理が開始される。
このコンパイル処理の際、プローブ挿入部２１は、計測対象とするメソッドのステートメントに性能計測コード（プローブ）を挿入すると共に、該ステートメントに関する情報をステートメント構文情報記憶部１４３に記憶する（図８、ステップＳ１０１）。
【００３８】
次に、ステップＳ１０１で作成された目的プログラムを実行するための指示が入力部１２より入力され、その入力情報が制御部１６に送信されると、プログラム実行部２３は、目的プログラムを実行する。
この目的プログラムの実行の際、計測部２４は、処理されるステートメントの開始や、終了を示す情報やそのときの時刻などを計測して記録する（ステップＳ１０２）。
【００３９】
そして、目的プログラムの実行が完了すると、ステートメント情報集計部２５は、ステップＳ１０２で記録したステートメントに関する情報から、ステートメントの処理時間等を集計する。そして、ステートメント情報表示部２６は、集計した情報を表示する（ステップＳ１０３）。
以上で、プロファイリング処理は終了する。
【００４０】
次に、概略を説明したプロファイリング処理を、図９〜図２０を参照してより詳細に説明する。
【００４１】
（１）図８ステップＳ１０１のプローブ挿入処理：
まず、プローブ挿入部２１は、記憶部１４に記憶されているソースプログラムの構文を解析して、ソースプログラムを抽象構文木（ＡＳＴ）と呼ばれる木構造に変換する（図９、ステップＳ２０１）。なお、この処理は一般的なコンパイラの構文解析の処理によって行われる処理と実質的に同等な処理である。
ここで、図１０に抽象構文木の例を示す。この図に示すように、抽象構文木は、ソースプログラムを構成するパッケージ、クラス、フィールド、メソッド、ステートメント、ブロックをノードとして、木構造で表現したものであり、ソースプログラムの構造が明確になる。
【００４２】
次に、プローブ挿入部２１は、木構造に変換したソースプログラムから、メソッドを１つ選択する（ステップＳ２０２）。
【００４３】
続いて、プローブ挿入部２１は、プローブ挿入対象メソッド記憶部１４１に記憶されている情報に基づいて、ステップＳ２０２で選択したメソッドが、プローブの挿入対象になっているか否かを判別する（ステップＳ２０３）。具体的には、ステップＳ２０２で選択したメソッドがプローブ挿入対象メソッド記憶部１４１に登録されている場合、プローブ挿入部２１は該メソッドをプローブ挿入対象と判別する。
【００４４】
プローブ挿入対象のメソッドでないと判別した場合（ステップＳ２０３；Ｎｏ）、プローブ挿入部２１は、処理をステップＳ２１０に移す。
プローブ挿入対象のメソッドであると判断した場合（ステップＳ２０３；Ｙｅｓ）、プローブ挿入部２１は、該メソッドに含まれるステートメントを１つ選択する（ステップＳ２０４）。
【００４５】
続いて、プローブ挿入部２１は、プローブ挿入対象ステートメント記憶部１４２に記憶されている情報に基づいて、ステップＳ２０４で選択したステートメントが、プローブの挿入対象になっているか否かを判別する（ステップＳ２０５）。具体的には、プローブ挿入部２１は、プローブ挿入対象ステートメント記憶部１４２を参照して、ステップＳ２０４で選択したステートメントが属するカテゴリのプローブ挿入対象可否フラグが「可」に設定されているか否かを判別する。
【００４６】
プローブ挿入対象のステートメントでないと判別した場合（ステップＳ２０５；Ｎｏ）、プローブ挿入部２１は、処理をステップＳ２０９に移す。
【００４７】
プローブ挿入対象のステートメントであると判断した場合（ステップＳ２０５；Ｙｅｓ）、プローブ挿入部２１は、該ステートメントに対してステートメント番号（ＩＤ）を発行する（ステップＳ２０６）。
なお、該ステートメントがブロックを含んでいる場合には、該ブロックに対して、ブロック番号（ＩＤ）を発行する。
【００４８】
続いて、プローブ挿入部２１は、該ステートメントに計測用のプローブを挿入する（ステップＳ２０７）。
【００４９】
この計測用のプローブは、挿入する位置により、ステートメント開始プローブと、ブロック開始プローブと、ステートメント終了プローブとの３つの種類に分かれる。
【００５０】
ステートメント開始プローブは、ステートメントの処理の開始直前の位置に挿入されるプローブであり、該ステートメントの処理が開始されたことを示す情報および、そのときの時刻（ステートメント開始時刻）とを取得して、記録する処理を行う。
【００５１】
ブロック開始プローブは、ステートメントがブロックを含む場合に、ブロックの処理の開始直前の位置に挿入されるプローブであり、該ブロックの処理が開始されたことを示す情報および、そのときの時刻（ブロック開始時刻）とを取得して、記録する処理を行う。
【００５２】
ステートメント終了プローブは、ステートメントの処理の終了直後の位置に挿入されるプローブであり、該ステートメントの処理が終了したことを示す情報および、そのときの時刻（ステートメント終了時刻）とを取得して、記録する処理を行う。
【００５３】
ここで、具体例を挙げてこのプローブの挿入の処理について説明する。図１１は、プローブ挿入の工程を説明するための図である。
図１１（Ａ）に示すソースプログラムには、メソッド「MethodA」が記述されている。そして、このメソッド「MethodA」には、条件分岐処理を制御するステートメント「ｉｆ」が含まれている。また、ステートメント「ｉｆ」は、分岐条件により２つのブロックＢ１、Ｂ２を含んでいる。このようなソースプログラムに対して、プローブが挿入された例を図１１（Ｂ）に示す。
【００５４】
図１１（Ｂ）において、メソッド「EnterStatement」は、ステートメント開始プローブに相当し、ステートメント「ＩＦ」の処理の開始直前に挿入される。またメソッド「EnterStatement」の引数「１２３４」は、ステップＳ２０６の処理で当該ステートメントに付与されたステートメント番号である。
また、メソッド「EnterBlock」は、ブロック開始プローブに相当し、ステートメント「ＩＦ」に含まれるブロックＢ１、Ｂ２の処理の開始直前に挿入される。またメソッド「EnterBlock」の引数「１２３５」および「１２３６」は、ステップＳ２０６の処理で各ブロックに付与されたブロック番号である。
また、メソッド「ExitStatement」は、ステートメント終了プローブに相当し、ステートメント「ＩＦ」の処理の終了直後に挿入される。
【００５５】
図９に戻り、続いて、プローブ挿入部２１は、ステップＳ２０１で抽象構文木に変換したソースプログラムを解析して、ステップＳ２０７の処理でプローブを挿入したステートメント／ブロックの親ステートメント／ブロック番号、種類（カテゴリ）、ソースプログラム名、開始位置情報、および、終了位置情報を取得する。プローブ挿入部２１は、取得したこれらの情報を、ステップＳ２０６で発行したメソッド／ブロック番号に対応付けて１つのエントリとして、ステートメント構文情報記憶部１４３に登録する（ステップＳ２０８）。
【００５６】
続いて、ステップＳ２０９で、プローブ挿入部２１は、ステップＳ２０４で選択していないステートメントが有るか否かを判別する。
選択していないステートメントが有ると判別した場合（ステップＳ２０９；Ｙｅｓ）、プローブ挿入部２１は、ステップＳ２０４〜ステップＳ２０８の処理を繰り返す。
選択していないメソッドが無いと判別した場合（ステップＳ２０９；Ｎｏ）、プローブ挿入部２１は、処理をステップＳ２１０に移す。
【００５７】
ステップＳ２１０で、プローブ挿入部２１は、ステップＳ２０２で選択していないメソッドが有るか否かを判別する。
選択していないメソッドが有ると判別した場合（ステップＳ２１０；Ｙｅｓ）、プローブ挿入部２１は、ステップＳ２０２に処理を移す。
選択していないメソッドが無いと判別した場合（ステップＳ２１０；Ｎｏ）、目的プログラム生成部２２は、プローブ挿入済のソースプログラムから、目的プログラムを作成し（ステップＳ２１１）、プローブ挿入処理は終了する。
なお、この目的プログラムの作成は、一般的なコンパイラによる公知の手法によって行えばよい。すなわち、目的プログラム生成部２２は、プローブ挿入済のソースプログラムから、ＪＡＶＡ（登録商標）仮想マシンのバイトコード（中間コード）で記述された目的プログラムを作成する。
【００５８】
（２）図８ステップＳ１０２の計測処理：
プログラム実行部２３が、プローブ挿入済みの目的プログラムを実行して、目的プログラムのメソッドに埋め込まれているプローブが実行されると、計測部２４は、メソッドに含まれるステートメントの開始時刻や終了時刻等の計測を行う（図１２、ステップＳ３０１）。
そして、計測部２４は、計測結果をステートメント詳細性能ログ記憶部１４４に記憶する（ステップＳ３０２）。
以上で計測処理は終了する。
【００５９】
次に、プローブの種類毎に、計測処理の動作についてより具体的に説明する。
ステートメント開始プローブが実行されると、計測部２４は、そのときの時刻と、スレッド名と、ステートメント番号とを取得する（ステップＳ３０１）。なお、この時刻の取得は、例えば、制御部１６が備えるタイマによって行う。また、スレッド名は、例えば、公知のＡＰＩを実行することで取得する。また、ステートメント番号は、例えば、ステートメント開始プローブの引数に設定されているので、それを取得する。
【００６０】
続いて、計測部２４は、取得したこれらの情報を対応付けて１つのエントリとしてステートメント詳細性能ログ記憶部１４４に登録する（ステップＳ３０２）。なお、このエントリの種類情報は「ステートメント開始」に設定する。また、このエントリにはユニークなログＩＤを発行する。
【００６１】
例えば、図６に示すステートメント詳細性能ログ記憶部１４４のログＩＤ「１」のエントリは、ステートメント開始プローブが実行されたことにより作成されたエントリである。
【００６２】
また、ブロック開始プローブが実行されると、計測部２４は、そのときの時刻と、スレッド名と、ブロック番号とを取得する（ステップＳ３０１）。なお、スレッド名は、例えば、公知のＡＰＩを実行することで取得する。またブロック番号は、例えば、ブロック開始プローブの引数に設定されているので、それを取得する。
【００６３】
続いて、計測部２４は、取得したこれらの情報を対応付けて１つのエントリとしてステートメント詳細性能ログ記憶部１４４に登録する（ステップＳ３０２）。なおこの際、このエントリの種類情報は「ブロック開始」に設定する。また、このエントリにはユニークなログＩＤを発行する。
【００６４】
例えば、図６に示すステートメント詳細性能ログ記憶部１４４のログＩＤ「２」のエントリは、ブロック開始プローブが実行されたことにより作成されたエントリである。
【００６５】
また、ステートメント終了プローブが実行されると、計測部２４は、そのときの時刻と、スレッド名と、ステートメント番号とを取得する（ステップＳ３０１）。なお、スレッド名は、例えば、公知のＡＰＩを実行することで取得する。またステートメント番号は、例えば、ステートメント終了プローブの引数に設定されているので、それを取得する。
【００６６】
続いて、計測部２４は、取得したこれらの情報を対応付けて１つのエントリとしてステートメント詳細性能ログ記憶部１４４に登録する（ステップＳ３０２）。なおこの際、このエントリの種類情報は「ステートメント終了」に設定する。また、このエントリにはユニークなログＩＤを発行する。
【００６７】
例えば、図６に示すステートメント詳細性能ログ記憶部１４４のログＩＤ「４」のエントリは、ステートメント終了プローブが実行されたことにより作成されたエントリである。
以上で、計測処理は終了する。
【００６８】
（３）図８ステップＳ１０３の集計・表示処理：
まず、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から、先頭のエントリを１つ読み込む（図１３、ステップＳ４０１）。
【００６９】
次に、ステートメント情報集計部２５は、ステップＳ４０１で読み込んだエントリの種類情報が「ステートメント終了」を表す情報であるか否かを判別する（ステップＳ４０２）。
【００７０】
エントリの種類情報が「ステートメント終了」を表す情報でないと判別した場合（ステップＳ４０２；Ｎｏ）、ステップＳ４０１で読み込んだエントリの種類情報は、「ステートメント開始」又は「ブロック開始」を表す情報となる。そして、ステートメント情報集計部２５は、このエントリに含まれるスレッドの識別情報（スレッド名）を取得する（ステップＳ４０３）。
【００７１】
続いて、ステートメント情報集計部２５は、ステップＳ４０３で取得したスレッド名に対応付けられているスタックに、このエントリのログＩＤを積む（ステップＳ４０４）。なお、スレッド名に対応付けられているスタックが無い場合には、ステートメント情報集計部２５は、該スレッド名に対応付けたスタックを作成し、そのスタックに、ログＩＤを積む。
そして、ステートメント情報集計部２５は、処理をステップＳ４０１に移し、ステートメント詳細性能ログ記憶部１４４から、次の先頭のエントリを１つ読み込み、ステップＳ４０２からの処理を繰り返す。
【００７２】
ステップＳ４０２で、エントリの種類情報が「ステートメント終了」を表す情報であると判別した場合（ステップＳ４０２；Ｙｅｓ）、ステートメント情報集計部２５は、このエントリに含まれるスレッドの識別情報（スレッド名）を取得する（ステップＳ４０５）。
【００７３】
そして、ステートメント情報集計部２５は、ステップＳ４０５で取得したスレッド名に対応付けられているスタックから、スタックの先頭に積まれているステートメント詳細性能ログ記憶部１４４のログＩＤを取り出す（ステップＳ４０６）。
【００７４】
続いて、ステートメント情報集計部２５は、ステップＳ４０６で取り出したログＩＤから、ステートメント詳細性能ログ記憶部１４４のエントリを特定し、特定したエントリの種類情報が「ステートメント開始」を表す情報か「ブロック開始」を表す情報のどちらであるかを判別する（ステップＳ４０７）。
【００７５】
ステップＳ４０７で、エントリの種類情報が「ステートメント開始」を表す情報であると判別した場合、ステートメント情報集計部２５は、処理をステップＳ４０８に移す。
【００７６】
ステップＳ４０７で、エントリの種類情報が「ブロック開始」を表す情報であると判別した場合、ステートメント情報集計部２５は、図１５（Ａ）に示すブロック処理時間算出・記録処理を開始する（図１４、ステップＳ４１０）。
【００７７】
ブロック処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部２５は、ステップＳ４０２で種類情報が「ステートメント終了」を示すと判断したエントリに含まれる実行時間（即ち、ステートメントの終了時間）を取得する（ステップＳ４１０１）。
次に、ステートメント情報集計部２５は、ステップＳ４０７で、種類情報が「ブロック開始」を示すと判断したエントリに含まれる実行時間（即ちブロックの開始時間）を取得する（ステップＳ４１０２）。
そして、ステートメント情報集計部２５は、取得したステートメントの終了時間からブロックの開始時間を減算した時間をブロックの処理時間として算出する（ステップＳ４１０３）。
そして、ステートメント情報集計部２５は、算出したブロックの処理時間と、当該ブロックの識別情報（ブロック番号等）とを対応付けてＲＡＭ１６３に記録する（ステップＳ４１０４）。
以上で、ブロック処理時間算出・記録処理（ステップＳ４１０）は終了する。
【００７８】
図１４に戻り、続いて、ステートメント情報集計部２５は、ステップＳ４０６でログＩＤを取り出したスタックと同じスタックから、スタックの先頭に積まれているログＩＤを取り出す（ステップＳ４１１）。
【００７９】
そして、ステートメント情報集計部２５は、ステップＳ４１１で取り出したログＩＤから、ステートメント詳細性能ログ記憶部１４４のエントリを特定し、特定したエントリの種類情報が「ステートメント開始」を表す情報か「ブロック開始」を表す情報のどちらであるかを判別する（ステップＳ４１２）。
【００８０】
ステップＳ４１２で、エントリの種類情報が「ブロック開始」を表す情報であると判別した場合、ステートメント情報集計部２５は、図１５（Ｂ）に示すブロック処理時間算出・記録処理を開始する（ステップＳ４１３）。
【００８１】
ブロック処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部２５は、ステップＳ４１０、または、前回のステップＳ４１３の処理によって処理時間を求めたブロックの処理開始時間（前ブロックの開始時間）を取得する（ステップＳ４１３１）。
次に、ステートメント情報集計部２５は、ステップＳ４１２で種類情報が「ブロック開始」を示すと判断したエントリに含まれる処理時間（ブロックの開始時間）を取得する（ステップＳ４１３２）。
そして、ステートメント情報集計部２５は、取得した前ブロックの開始時間からブロックの開始時間を減算した時間をブロックの処理時間として算出する（ステップＳ４１３３）。
そして、ステートメント情報集計部２５は、算出したブロックの処理時間と、当該ブロックの識別情報（ブロック番号等）とを対応付けてＲＡＭ１６３に記録する（ステップＳ４１３４）。
以上で、ブロック処理時間算出・記録処理（ステップＳ４１３）は終了する。図１４に戻り、続いて、ステートメント情報集計部２５は、処理をステップＳ４１１に移す。
【００８２】
ステップＳ４１２で、エントリの種類情報が「ステートメント開始」を表す情報であると判別した場合、ステートメント情報集計部２５は、図１６（Ａ）に示すステートメント内部処理時間算出・記録処理を開始する（ステップＳ４１４）。
【００８３】
ステートメント内部処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部２５は、ステップＳ４１０、または、ステップＳ４１３の処理によって処理時間を求めたブロックの開始時間（ブロックの開始時間）を取得する（ステップＳ４１４１）。
次に、ステートメント情報集計部２５は、ステップＳ４１２で、種類情報が「ステートメント開始」を示すと判断したエントリに含まれる実行時間（即ちステートメントの開始時間）を取得する（ステップＳ４１４２）。
そして、ステートメント情報集計部２５は、取得したブロックの開始時間からステートメントの開始時間を減算した時間を、ステートメントの内部処理時間として算出する（ステップＳ４１４３）。
そして、ステートメント情報集計部２５は、算出したステートメントの内部処理時間と、当該ステートメントの識別情報（ステートメント番号等）とを対応付けてＲＡＭ１６３に記録する（ステップＳ４１４４）。
以上で、ステートメント内部処理時間算出・記録処理（ステップＳ４１４）は終了する。図１３に戻り、続いて、ステートメント情報集計部２５は、処理をステップＳ４０８に移す。
【００８４】
ステップＳ４０８で、ステートメント情報集計部２５は、図１６（Ｂ）に示すステートメント処理時間算出・記録処理を開始する。
【００８５】
ステートメント処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部２５は、ステップＳ４０２で種類情報が「ステートメント終了」を示すと判断したエントリに含まれる処理時間（即ち、ステートメントの終了時間）を取得する（ステップＳ４０８１）。
次に、ステートメント情報集計部２５は、ステップＳ４０７、又はステップＳ４１２で、種類情報が「ステートメント開始」を示すと判断したエントリに含まれる実行時間（即ちステートメントの開始時間）を取得する（ステップＳ４０８２）。
そして、ステートメント情報集計部２５は、取得したステートメントの終了時間から、ステートメントの開始時間を減算した時間をステートメントの処理時間として算出する（ステップＳ４０８３）。
そして、ステートメント情報集計部２５は、算出したステートメントの処理時間と、当該ステートメントの識別情報（ステートメント番号等）とを対応付けてＲＡＭ１６３に記録する（ステップＳ４０８４）。
以上で、ステートメント処理時間算出・記録処理（ステップＳ４０８）は終了する。
【００８６】
図１３に戻り、続いて、ステートメント情報集計部２５は、読み込んでいないステートメント詳細性能ログ記憶部１４４のエントリが有るか否かを判別する（ステップＳ４０９）。
読みこんでいないエントリが有ると判別した場合（ステップＳ４０９；Ｙｅｓ）、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から先頭のエントリを取得し（ステップＳ４０１）、以下ステップＳ４０２からの処理を繰り返す。
読みこんでいないエントリがないと判別した場合（ステップＳ４０９；Ｎｏ）、ステートメント情報集計部２５は、上述の一連の処理でＲＡＭ１６３に記憶してきたステートメントの処理時間、内部処理時間と、ブロックの処理時間とを一覧表示する画面を出力部１３に表示する（ステップＳ４１５）。
以上で集計・表示処理は終了する。
【００８７】
続いて、具体例を挙げて、この集計・表示処理について説明する。
具体例として、ステートメント詳細性能ログ記憶部１４４には、図１７に示すような情報が記憶されているものとする。すなわち、ステートメント番号Ｓ１を有するステートメント（以下、ステートメント「Ｓ１」とする）が開始された後、ブロック番号Ｂ１を表すブロック（以下、ブロック「Ｂ１」とする）と、ブロック「Ｂ２」とが実行され、その後ステートメント「Ｓ２」が開始、終了した後、ステートメント「Ｓ１」が終了していることが、このステートメント詳細性能ログ記憶部１４４に記録されている。
【００８８】
このようなステートメント詳細性能ログ記憶部１４４の状態で集計・表示処理が開始されると、まず、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から、先頭のエントリ即ちログＩＤ「１」のエントリを読み込む（ステップＳ４０１）。
【００８９】
そして、読み込んだエントリの種類情報は、「ステートメント開始」であるため（ステップＳ４０２；Ｎｏ）、処理をステップＳ４０３に移し、そのエントリのスレッド名「＃１」を取得する（ステップＳ４０３）。
【００９０】
そして、取得したスレッド名「＃１」に関連付けたスタックを作成し、作成したスタックにこのエントリのログＩＤ「１」を、図１８（Ａ）に示すように積む（ステップＳ４０４）。
【００９１】
そして、ステップＳ４０１の処理に戻り、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から、先頭のエントリを読み出し（ステップＳ４０１）、種類が「ステートメント終了」以外のエントリは、該エントリのスレッド名を取得し（ステップＳ４０３）、取得したスレッド名に関連付けられているスレッドに、該エントリのログＩＤを積む（ステップＳ４０４）。すなわち、以下ログＩＤ「２」〜「４」を有するエントリに対して、順にステップＳ４０１〜Ｓ４０４の処理が繰り返され、そのエントリのログＩＤがスタックに積まれ、スレッド名「＃１」に関連付けられたスタックは図１８（Ｂ）に示すような状態になる。
【００９２】
続いて、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から、先頭のエントリ即ちログＩＤ「５」のエントリを読み込む（ステップＳ４０１）。
【００９３】
読み込んだエントリの種類情報は、「ステートメント終了」であるため（ステップＳ４０２；Ｙｅｓ）、処理をステップＳ４０５に移し、そのエントリのスレッド名「＃１」を取得する（ステップＳ４０５）。
【００９４】
そして、ステートメント情報集計部２５は、取得したスレッド名「＃１」に対応付けられている、図１８（Ｂ）に示すような状態のスタックから、先頭に積まれているログＩＤ「４」を取り出す（ステップＳ４０６）。
よって、この処理により、スタックは図１８（Ｃ）に示すような状態になる。
【００９５】
取り出したログＩＤ「４」を有するエントリの種類情報は、「ステートメント開始」であるため、ステートメント情報集計部２５は、ステートメント処理時間算出・記録処理を開始する（ステップＳ４０８）。
【００９６】
ステートメント処理時間算出・記録処置が開始されると、ステートメント情報集計部２５は、ステップＳ４０２で種類情報が「ステートメント終了」を示すと判断したログＩＤ「５」を有するエントリに含まれる実行時間（ステートメント終了時間）「２１００」を取得する（ステップＳ４０８１）。
そして、ステートメント情報集計部２５は、ステップＳ４０７で種類情報が「ステートメント開始」を示すと判断したログＩＤ「４」を有するエントリに含まれる実行時間（ステートメント開始時間）「１６００」とステートメント番号「Ｓ２」とを取得する（ステップＳ４０８２）。
そして、ステートメント情報集計部２５は、取得したステートメント終了時間「２１００」からステートメント開始時間「１６００」を減算した時間「５００」をステートメント番号「Ｓ２」を有するステートメントの処理時間として算出する（ステップＳ４０８３）。
そして、ステートメント情報集計部２５は、算出したステートメントの処理時間「５００」と、ステートメント番号「Ｓ２」とを対応付けてＲＡＭ１６３に図１９のＬ１に示すように記憶する（ステップＳ４１０４）。
以上でステートメント処理時間算出・記録処理は終了する。
【００９７】
続いて、ステートメント情報集計部２５は、ステートメント詳細性能ログ記憶部１４４から、先頭のエントリ即ちログＩＤ「６」のエントリを読み込む（ステップＳ４０１）。
【００９８】
読み込んだエントリの種類情報は、「ステートメント終了」であるため（ステップＳ４０２；Ｙｅｓ）、処理をステップＳ４０５に移し、そのエントリのスレッド名「＃１」を取得する（ステップＳ４０５）。
【００９９】
そして、ステートメント情報集計部２５は、取得したスレッド名「＃１」に対応付けられている図１８（Ｃ）に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部１４４のログＩＤ「３」を取り出す（ステップＳ４０６）。
よって、この処理により、スタックは図１８（Ｄ）に示すような状態になる。
【０１００】
取り出したログＩＤ「３」を有するエントリの種類情報は、「ブロック開始」であるため、ステートメント情報集計部２５は、ブロック処理時間算出・記録処理を開始する（ステップＳ４１０）。
【０１０１】
ブロック処理時間算出・記録処理が開始されると、ステートメント情報集計部２５は、ステップＳ４０２で種類情報が「ステートメント終了」を示すと判断したログＩＤ「６」を有するエントリに含まれる実行時間（ステートメント終了時間）「２８００」を取得する（ステップＳ４１０１）。
そして、ステートメント情報集計部２５は、ステップＳ４０７で種類情報が「ブロック開始」を示すと判断したログＩＤ「３」を有するエントリに含まれる実行時間（ブロック開始時間）「１４５０」とブロック番号「Ｂ２」とを取得する（ステップＳ４１０２）。
そして、ステートメント情報集計部２５は、取得したステートメント終了時間「２８００」からブロック開始時間「１４５０」を減算した時間「１３５０」をブロック「Ｂ２」を有するブロックの処理時間として算出する（ステップＳ４１０３）。
そして、ステートメント情報集計部は、算出したブロックの処理時間「１３５０」と、ブロック番号「Ｂ２」とを対応付けて、ＲＡＭ１６３に図１９のＬ２に示すように記憶する（ステップＳ４１０４）。
以上で、ブロック処理時間算出・記録処理は終了する。
【０１０２】
そして、ステートメント情報集計部２５は、取得したスレッド名「＃１」に対応付けられている図１８（Ｄ）に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部１４４のログＩＤ「２」を取り出す（ステップＳ４１１）。
よって、この処理により、スタックは図１８（Ｅ）に示すような状態になる。
【０１０３】
取り出したログＩＤ「２」を有するエントリの種類情報は、「ブロック開始」であるため、ステートメント情報集計部２５は、ブロック処理時間算出・記録処理を開始する（ステップＳ４１３）。
【０１０４】
ブロック処理時間算出・記録処理が開始されると、ステートメント情報集計部２５は、ステップＳ４１０の処理によって処理時間を求めたブロックの開始時間（前ブロック開始時間）「１４５０」を取得する（ステップＳ４１３１）。
そして、ステートメント情報集計部２５は、ステップＳ４１２で種類情報が「ブロック開始」を示すと判断したログＩＤ「２」を有するエントリに含まれる実行時間（ブロック開始時間）「１２００」および、ブロック番号「Ｂ１」を取得する（ステップＳ４１３２）。
そして、ステートメント情報集計部２５は、取得した前ブロック開始「１４５０」からブロック開始時間「１２００」を減算した時間「２５０」を、ブロック番号「Ｂ１」を有するブロックの処理時間として算出する（ステップＳ４１３３）。
そして、ステートメント情報集計部２５は、算出したブロックの処理時間「２５０」と、ブロック番号「Ｂ１」とを対応付けて、ＲＡＭ１６３に図１９のＬ３に示すように記憶する（ステップＳ４１３４）。
以上でブロック処理時間算出・記録処理は終了する。
【０１０５】
続いて、ステートメント情報集計部２５は、ステップＳ４１１に戻り、スレッド名「＃１」に対応付けられている図１８（Ｅ）に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部１４４のログＩＤ「１」を取り出す（ステップＳ４１１）。
よって、この処理により、スタックは図１８（Ｆ）に示すような状態になる。
【０１０６】
取り出したログＩＤ「１」を有するエントリの種類情報は、「ステートメント開始」であるため、ステートメント情報集計部２５は、ステートメント内部処理時間算出・記録処理を開始する（ステップＳ４１４）。
【０１０７】
ステートメント内部処理時間算出・記録処理が開始すると、ステートメント情報集計部２５は、前回のステップＳ４１３の処理によって処理時間を求めたブロックの開始時間（ブロック開始時間）「１２００」を取得する（ステップＳ４１４１）。
そして、ステートメント情報集計部２５は、ステップＳ４１２で種類情報が「ステートメント開始」を示すと判断したログＩＤ「１」を有するエントリに含まれる実行時間（ステートメント開始時間）「１０００」および、ステートメント番号「Ｓ１」を取得する（ステップＳ４１４２）。
そして、ステートメント情報集計部２５は、取得したブロック開始時間「１２００」からステートメント開始時間「１０００」を減算した時間「２００」をステートメント番号「Ｓ１」を有するステートメントの内部処理時間として算出する（ステップＳ４１４３）。
そして、ステートメント情報集計部２５は、算出したステートメントの内部処理時間「２００」と、ステートメント番号「Ｓ１」とを対応付けて、ＲＡＭ１６３に図１９のＬ４に示すように記憶する（ステップＳ４１４４）。
以上でステートメント内部処理時間算出・記録処理は終了する。
【０１０８】
続いて、ステートメント情報集計部２５は、ステートメントの処理時間算出・記録処理を開始する（ステップＳ４０８）。
【０１０９】
ステートメント処理時間算出・記録処置が開始されると、ステートメント情報集計部２５は、ステップＳ４０２で種類情報が「ステートメント終了」を示すと判断したログＩＤ「６」を有するエントリに含まれる実行時間（ステートメント終了時間）「２８００」を取得する（ステップＳ４０８１）。
そして、ステートメント情報集計部２５は、ステップＳ４１２で種類情報が「ステートメント開始」を示すと判断したログＩＤ「１」を有するエントリに含まれる実行時間（ステートメント開始時間）「１０００」とステートメント番号「Ｓ１」とを取得する（ステップＳ４０８２）。
そして、ステートメント情報集計部２５は、取得したステートメント終了時間「２８００」からステートメント開始時間「１０００」を減算した時間「１８００」をステートメント番号「Ｓ１」を有するステートメントの処理時間として算出する（ステップＳ４０８３）。
そして、ステートメント情報集計部２５は、算出したステートメントの処理時間「１８００」と、ステートメント番号「Ｓ１」とを対応付けて、ＲＡＭ１６３に図１９のＬ５に示すように記憶する。
以上でステートメント処理時間算出・記録処理は終了する。
【０１１０】
続いて、ステートメント詳細性能ログ記憶部１４４に読み込んでいないエントリがないため（ステップＳ４０９；Ｎｏ）、ステートメント情報集計部２５は、ＲＡＭ１６３に記憶してきた、ステートメントの処理時間、内部処理時間と、ブロックの処理時間とを一覧表示する図２０に示すような画面を表示して、集計・表示処理は終了する。
なお、この画面に表示されているステートメントやブロックの種類や、ステートメントやブロックがどのステートメントから呼ばれているのかの関係を示す情報やメソッド名等は、ステートメント構文情報記憶部１４３を参照して取得すればよい。
【０１１１】
以上説明したように、この実施の形態では、ソースプログラムをコンパイルする際に、メソッドの構文情報を解析し、計測対象のステートメントに対して、計測用のプローブを挿入する。そして、プローブが挿入されたプログラム（目的プログラム）を実行する際、計測用のプローブの処理によりステートメントの処理が実行される度に、その処理時間を計測する。
そのため、メソッドの処理時間の算出を、ステートメントの処理単位で行うことができる。
また、ソースプログラムに挿入する計測用のプローブは、ステートメントの処理の開始、終了時点および、ブロックの開始時点に挿入し、ブロックの終了時点には挿入しない。そのため、挿入するプローブの数を少なくすることができ、プロファイリング処理による実行環境への負荷は小さくなり、より実際の実行環境に近い条件で計測を行うことができる。
【０１１２】
なお、この発明は上記実施の形態に限定されず、様々な応用が可能である。
【０１１３】
例えば、本実施形態では、プローブ挿入対象メソッド記憶部１４１に登録されているメソッドに対してのみプローブの挿入を行ったが、プログラムを構成する全てのメソッドにプローブを挿入してもよい。この場合は、プローブ挿入対象メソッド記憶部１４１を備える必要はない。
【０１１４】
また、本実施形態では、プローブ挿入対象ステートメント記憶部１４２に登録されている種類（カテゴリ）のステートメントに対してのみプローブの挿入を行ったが、全ての種類（カテゴリ）のステートメントにプローブを挿入してもよい。この場合は、プローブ挿入対象ステートメント記憶部１４２を備える必要はない。
【０１１５】
また、本実施形態では、コンパイルの際に、構文情報を解析し、プローブを挿入し、プローブを挿入したプローブの構文情報をステートメント構文情報記憶部１４３に記憶したが、コンパイル時に必ずしもこの処理を行う必要はない。例えば、ソースプログラムの編集の際に、上述の処理を行ってもよい。
【０１１６】
また、本実施形態では、ステートメント詳細性能ログ記憶部１４４に記憶されている情報から、ステートメント／ブロックの処理時間を集計する際にスタックを利用して集計したが、これに限る必要はない。
例えば、ステートメント詳細性能ログ記憶部１４４に記憶されている情報から、以下の（ａ）〜（ｃ）に示すような方法で、処理時間を求めてもよい。
（ａ）ステートメントの処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ステートメント開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名、ステートメント番号であり、種類情報「ステートメント終了」を有するエントリが最初に見付かった時点で、両者のエントリに含まれる実行時間の差を該ステートメントの処理時間として求める。
（ｂ）ブロックの処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ブロック開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名であり、種類情報「ブロック開始」又は「ステートメント終了」を有するエントリを最初に読み込んだ時点で、両者のエントリに含まれる実行時間の差を、最初に読み込んだ方のエントリに対応するブロックの処理時間として求める。
（ｃ）ステートメントの内部処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ステートメント開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名であり、種類情報「ブロック開始」を有するエントリが最初に読み込んだ時点で、両者のエントリに含まれる実行時間の差を、該ステートメントの内部処理時間として求める。
【０１１７】
また、本実施形態でプロファイリングの対象とするソースプログラムの言語をＪＡＶＡ（登録商標）としたが、これに限るものではなく、例えばＦＯＲＴＲＡＮやＣ言語やＶＩＳＵＡＬ  ＢＡＳＩＣ（登録商標）等の他のプログラム言語をプロファイリングの対象としてもよい。
【０１１８】
なお、本発明のプログラムプロファイリング装置は、専用のハードウェアに限られるものではなく、通常のコンピュータシステムによっても実現することができる。
具体的には、上記実施の形態では、プログラムプロファイリング装置のプログラムが、メモリ等に予め記憶されているものとして説明した。しかし、上述の処理動作を実行させるためのプログラムを、フレキシブルディスク、ＣＤ−ＲＯＭ（Compact Disk Read-Only Memory）、ＤＶＤ（Digital Versatile Disk）、ＭＯ（Magneto-Optical disk）等のコンピュータ読み取り可能な記録媒体に格納して配布し、そのプログラムをコンピュータにインストールすることにより、上述の処理を実行するプログラムプロファイリング装置を構成してもよい。
【０１１９】
また、プログラムをインターネット等の通信ネットワーク上のサーバ装置が有するディスク装置等に格納しておき、例えば、搬送波に重畳させて、コンピュータにダウンロード等するようにしてもよい。さらに、通信ネットワークを介してプログラムを転送しながら起動実行することによっても、上述の処理を達成することができる。
また、上述の機能を、ＯＳ（Operating System）が分担又はＯＳとアプリケーションの協働により実現する場合等には、ＯＳ以外の部分のみを媒体に格納して配布してもよく、また、コンピュータにダウンロード等してもよい。
【図面の簡単な説明】
【０１２０】
【図１】本発明の実施の形態に係るプログラムプロファイリング装置の構成例を示すブロック図である。
【図２】図１に示したプログラムプロファイリング装置の記憶部の構成を示す図である。
【図３】プローブ挿入対象メソッド記憶部の構成を示す図である。
【図４】プローブ挿入対象ステートメント記憶部の構成を示す図である。
【図５】ステートメント構文情報記憶部の構成を示す図である。
【図６】ステートメント詳細性能ログ記憶部の構成を示す図である。
【図７】本発明の実施の形態に係るプログラムプロファイリング装置の機能構成例を示すブロック図である。
【図８】プロファイリング処理の動作を説明するためのフローチャートである。
【図９】プローブ挿入処理の動作を説明するためのフローチャートである。
【図１０】抽象構文木の例を示した図である。
【図１１】プローブの挿入を説明するための図である。
【図１２】計測処理の動作を説明するためのフローチャートである。
【図１３】集計・表示処理の動作を説明するためのフローチャートである。
【図１４】集計・表示処理の動作を説明するためのフローチャートである。
【図１５】ブロック処理時間算出・記録処理の動作を説明するためのフローチャートである。
【図１６】（Ａ）は、ステートメント内部処理時間算出・記録処理の動作を説明するためのフローチャートである。（Ｂ）は、ステートメント処理時間算出・記録処理の動作を説明するためのフローチャートである。
【図１７】集計・表示処理の具体例において、集計処理の対象とするステートメント詳細性能ログ記憶部１４４のエントリを示した図である。
【図１８】集計・表示処理の具体例を説明するための図である。
【図１９】集計・表示処理によってＲＡＭ１６３に記憶される情報の例を示した図である。
【図２０】ステートメント、ブロックの処理時間を一覧表示する画面の例を示した図である。
【符号の説明】
【０１２１】
１  プログラムプロファイリング装置
１４１  プローブ挿入対象メソッド記憶部
１４２  プローブ挿入対象ステートメント記憶部
１４３  ステートメント構文情報記憶部
１４４  ステートメント詳細性能ログ記憶部
２１  プローブ挿入部
２２  目的プログラム生成部
２３  プログラム実行部
２４  計測部
２５  ステートメント情報集計部
２６  ステートメント情報表示部
【図１】
0004860564.tif 000002
【図２】
0004860564.tif 000003
【図３】
0004860564.tif 000004
【図４】
0004860564.tif 000005
【図５】
0004860564.tif 000006
【図６】
0004860564.tif 000007
【図７】
0004860564.tif 000008
【図８】
0004860564.tif 000009
【図９】
0004860564.tif 000010
【図１０】
0004860564.tif 000011
【図１１】
0004860564.tif 000012
【図１２】
0004860564.tif 000013
【図１３】
0004860564.tif 000014
【図１４】
0004860564.tif 000015
【図１５】
0004860564.tif 000016
【図１６】
0004860564.tif 000017
【図１７】
0004860564.tif 000018
【図１８】
0004860564.tif 000019
【図１９】
0004860564.tif 000020
【図２０】
0004860564.tif 000021