JP4860564B2 - プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム - Google Patents

プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム Download PDF

Info

Publication number
JP4860564B2
JP4860564B2 JP2007179079A JP2007179079A JP4860564B2 JP 4860564 B2 JP4860564 B2 JP 4860564B2 JP 2007179079 A JP2007179079 A JP 2007179079A JP 2007179079 A JP2007179079 A JP 2007179079A JP 4860564 B2 JP4860564 B2 JP 4860564B2
Authority
JP
Japan
Prior art keywords
statement
probe
processing time
block
information
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2007179079A
Other languages
English (en)
Other versions
JP2009015734A (ja
Inventor
広史 風戸
雅司 武市
利幸 木村
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NTT Data Corp
Original Assignee
NTT Data Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NTT Data Corp filed Critical NTT Data Corp
Priority to JP2007179079A priority Critical patent/JP4860564B2/ja
Publication of JP2009015734A publication Critical patent/JP2009015734A/ja
Application granted granted Critical
Publication of JP4860564B2 publication Critical patent/JP4860564B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、ボトルネックとなるメソッドの処理時間等を、ステートメント単位で詳細に計測することができるプログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラムに関する。
複数のメソッドで構成されたプログラムの処理性能の改善のために、プログラム全体の性能の低下に大きな影響を与える(ボトルネックとなる)メソッドを特定する必要がある。そのため、メソッドの処理時間を計測するなどの処理が行われている。このような一連の処理はプロファイリングと呼ばれている。
例えば、特許文献1は、ソースプログラムや目的プログラムを加工し、計測対象とするメソッドの前後にプローブを挿入し、このプローブの処理によってプロファイリングを行う技術を開示している。
また、特許文献2は、メソッド間の呼出関係をログへ出力するための技術を開示している
特開2004−94374号公報 特開2004−259154号公報
しかし、特許文献1および特許文献2で開示されている技術は、メソッド毎にメソッドの処理時間等を計測するにすぎず、メソッド内のステートメントの処理毎に処理時間等を計測することはできない。そのため、ボトルネックとなるメソッドを特定できても、特定したメソッド内のどの部分が性能低下の原因となっているのかを判別することはできない。
本発明は、上記実状に鑑みてなされたものであり、メソッド内をステートメントの処理単位でプロファイリングをすることができるプロファイリング装置等を提供することを目的とする。
上記目的を達成するため、本発明の第1の観点に係るプロファイリング装置は、
1つ又は複数のメソッドを含むソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段と、
前記ステートメント特定手段によって特定されたステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段と、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記プローブが挿入されたステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段と、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段と、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段と、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段と、を備え
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
前記ソースプログラムを構成するメソッドのうち、前記プローブの挿入対象とするメソッドの識別情報を記憶するプローブ挿入対象メソッド記憶手段をさらに備え、
前記プローブ挿入手段は、前記プローブ挿入対象メソッド記憶手段に識別情報が記憶されているメソッドに含まれる前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入してもよい。
前記プローブ挿入手段で処理の前後にプローブを挿入するステートメントがブロックを有している場合、該ブロックの処理の前に、該ブロックの処理時間を計測するためのブロック用プローブを挿入する、ブロック用プローブ挿入手段と、
前記プローブ挿入手段と前記ブロック用プローブ挿入手段とによってプローブとブロック用プローブとが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記ブロック用プローブを挿入したブロックの処理が開始する度に、該ブロックの開始を表す情報とそのときの時刻と該ブロックの処理が属するスレッドの識別情報とを対応付けて記憶するブロック情報記憶手段と、
前記ステートメント情報記憶手段と前記ブロック情報記憶手段とに記憶されている情報に基づいて、ブロックの処理時間を算出するブロック処理時間算出手段と、をさらに備え、
前記処理時間表示手段は、前記ブロック処理時間算出手段で算出したブロックの処理時間を表示してもよい。
前記ステートメント情報記憶手段と前記ブロック情報記憶手段に記憶されている情報とに基づいて、前記ブロックを有するステートメントの処理時間から該ブロックの処理時間を除いた処理時間を該ステートメントの内部処理時間として算出する、内部処理時間算出手段をさらに備え、
前記処理時間表示手段は、前記内部処理時間算出手段で算出したステートメントの内部処理時間を表示してもよい。
上記目的を達成するため、本発明の第2の観点に係るプログラムプロファイリング方法は、
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定ステップと、
前記ステートメント特定ステップで特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入ステップと、
前記プローブ挿入ステップによってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入ステップでプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶ステップと、
前記ステートメント情報記憶ステップによって記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出ステップと、
前記ステートメント処理時間算出ステップで算出したステートメントの処理時間を表示する処理時間表示ステップと、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶ステップと、を備え、
前記プローブ挿入ステップでは、前記ステートメント特定ステップで特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶ステップによって記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
上記目的を達成するため、本発明の第3の観点に係るプログラムは、
コンピュータを、
複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段、
前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段、
前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入手段でプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段、
前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段、
前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段、
ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段、
して機能させるプログラムであって、
前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
ことを特徴とする。
本発明によれば、メソッド内のステートメント毎に埋め込まれたプローブを実行することにより、メソッドをステートメントの処理単位でプロファイリングをすることが可能となる。
以下、本発明の実施形態に係るプログラムプロファイリング装置について、図面を参照して説明する。
プログラムプロファイリング装置1は、図1に示すように、通信部11と、入力部12と、出力部13と、記憶部14と、入出力I/F部15と、制御部16と、を備え、各部はバス17を介して互いに接続されている。
通信部11は、通信ネットワーク2を介して、ネットワーク上の情報処理装置等と通信を行うものであり、通信インタフェース等を備える。例えば、通信部11が、プロファイリングの対象となるソースプログラムを受信して取り込む。
なお、本実施形態でプロファイリングの対象とするソースプログラムの言語はJAVA(登録商標)とする。また、このソースプログラムは、1つ以上のクラスから構成され、各クラスは1つ以上のメソッドを備えているものとする。
また、メソッドは1つ以上のステートメントから構成されているものとする。また、ステートメントは、1つ又は複数の処理単位(ブロック)から構成されている場合もある。例えば、条件分岐処理を制御するステートメント「if」では、分岐条件毎に複数のブロックを有する場合がある。
入力部12は、キーボードやマウスなどから構成され、プログラムプロファイリング装置1に様々な情報や指示を入力する。
出力部13は、ディスプレイ等の表示装置から構成され、様々な情報を出力する。例えば、出力部13は、後述するプロファイリング処理において、メソッドのステートメント毎の処理時間を一覧表示した画面等を表示する。
記憶部14は、ハードディスク等から構成され、様々な情報やプログラム等を記憶する。例えば、記憶部14は、後述するプロファイリング処理を行う前に、予め、通信部11等を介して取り込んだソースプログラムを記憶しておく。
また、記憶部14は、図2に示すように、プローブ挿入対象メソッド記憶部141と、プローブ挿入対象ステートメント記憶部142と、ステートメント構文情報記憶部143と、ステートメント詳細性能ログ記憶部144と、を備える。
プローブ挿入対象メソッド記憶部141は図3に示すように、計測用のプローブを挿入するメソッドを特定する情報(クラス名とメソッド名と、引数の型と、戻り値の型)を記憶する。
プローブ挿入対象ステートメント記憶部142は、図4に示すように、ステートメントの種類(カテゴリ)毎に、該メソッドをプローブ挿入の対象とするか否かを示す情報(プローブ挿入可否フラグ)を記憶する。
ステートメント構文情報記憶部143は、図5に示すように、プローブが挿入されたステートメント/ブロック毎に、ステートメント/ブロック番号と、親ステートメント/ブロック番号と、種類と、ソースプログラム名と、開始位置情報と、終了位置情報とを記憶する。
ステートメント/ブロック番号はプローブが挿入されたステートメント/ブロックに付与されるユニークな番号である。
親ステートメント/ブロック番号は、当該ステートメント/ブロックが別のステートメント/ブロックから実行される場合、その実行元のステートメント/ブロックのステートメント/ブロック番号である。
種類(カテゴリ)は、当該ステートメント/ブロックが属する種類(カテゴリ)を表す情報である。
ソースプログラム名は、当該ステートメント/ブロックを含むソースプログラムの識別情報(プログラム名)である。
開始位置情報は、当該ステートメント/ブロックのソースプログラム内での開始位置を、バイト数および行番号とで表した情報である。
終了位置情報は、当該ステートメント/ブロックのソースプログラム内での終了位置を、バイト数および行番号とで表した情報である。
ステートメント詳細性能ログ記憶部144は、プロファイリングの結果を格納する。
ステートメント詳細性能ログ記憶部144は、図6に示すように、メソッド/ブロックを処理する度に、ログIDと、処理が実行された時刻(コンピュータあるいはプログラム固有の時刻でも、現在日時等でもよい)と、処理が属するスレッドの識別情報(スレッド名)と、ステートメント番号と、種類情報とを記憶する。
なお、この種類情報は、実行されたメソッドの処理の開始/終了、又は実行されたブロックの開始を示す情報である。
図1に戻り、入出力I/F部15は、入出力機器3を接続するためのインタフェースである。例えば、プロファイリング対象となるソースプログラム等を、通信部11ではなく、入出力I/F部15を介して、CD−ROMドライブ等の入出力機器3から取り込むこともできる。
制御部16は、データの演算処理を行うと共に、バス17を介して通信部11、入力部12、出力部13、記憶部14、入出力I/F部15を制御するものであり、CPU(Central Processing Unit)161、ROM(Read Only Memory)162、RAM(Random Access Memory)163等を備える。制御部16における演算処理及び制御処理は、具体的には、CPU161が、RAM163を作業領域として使用して各種データを一時的に記憶させながら、ROM162に記憶されている制御プログラムを実行することにより行われる。
制御部16が、ROM162や記憶部14に記憶されている制御プログラムに従って上記各部を制御することにより、プログラムプロファイリング装置1の後述するプロファイリング処理等が行われる。
また、制御部16は、タイマ、例えば、ソフトウェアタイマを備える。このタイマにより、制御部16は、後述するプロファイリング処理で、ステートメントの処理の開始・終了時刻等を取得する。
プログラムプロファイリング装置1は、機能的には、図7に示すように、プローブ挿入部21と、目的プログラム生成部22と、プログラム実行部23と、計測部24と、ステートメント情報集計部25と、ステートメント情報表示部26とを備える。なお、これらの各構成要素は、図1に示した制御部16が、同じく図1に示した通信部11、入力部12、出力部13、記憶部14、又は入出力I/F部15を制御することにより、実現する。
プローブ挿入部21は、プローブ挿入対象メソッド記憶部141で挿入対象であると設定されているメソッドに含まれるステートメントを特定する。そして、プローブ挿入部21は、特定したステートメントで、プローブ挿入対象ステートメント記憶部142でカテゴリが挿入対象であると設定されているステートメントに対して、計測用のプローブを挿入する。
また、プローブ挿入部21は、プローブを挿入したステートメントを、ステートメント構文情報記憶部143に登録する。
目的プログラム生成部22は、プローブが挿入されたソースプログラムから目的プログラムを生成する処理(コンパイル)を行う。この処理は、Sun Microsystems社のJDK(Java Development Kit)が提供するJAVA(登録商標)のコンパイラ等を利用して行えばよい。
プログラム実行部23は、目的プログラム生成部22で作成された目的プログラムを実行する。
計測部24は、プログラム実行部23によって実行された目的プログラムの処理に関する情報(処理開始時間等)を計測し、計測結果をステートメント詳細性能ログ記憶部144に格納する。なお、この計測は、ステートメントに含まれるステートメント/ブロックが実行される度に実施される。
ステートメント情報集計部25は、ステートメント構文情報記憶部143およびステートメント詳細性能ログ記憶部144に記憶されている情報から、ステートメント/ブロック毎の処理時間や、ステートメントの内部処理時間等を集計する。
このステートメントの内部処理時間とは、ステートメントの処理時間から、当該ステートメントが含むブロックの処理時間を除いた時間を意味する。
ステートメント情報表示部26は、ステートメント情報集計部25が集計した情報、例えば、ステートメント毎の処理時間等を表示する。
続いて、プログラムプロファイリング装置1で、プログラムをプロファイリングする処理について、概略を説明する。
なお、前提として、プロファイリングの対象となるソースプログラムは、記憶部14に記憶されているものとする。
また、予め、特開2004−94374号公報に開示されている技術等を用いて、目的プログラムを実行した際のメソッド毎の処理時間の計測が行われ、ボトルネックとなるメソッドが特定されているものとする。そして、このボトルネックとして特定されたメソッドは、ユーザの準備作業等により、プローブ挿入対象メソッド記憶部141に登録されているものとする。
また、どのカテゴリに属するステートメントをプロファイリングの対象とするのかを示す情報も、ユーザの準備作業等により、プローブ挿入対象ステートメント記憶部142に予め記憶されているものとする。
ユーザから、ソースプログラムをコンパイルするための指示入力が入力部12よりなされ、その入力情報が制御部16に送信されると、目的プログラムを作成するためのコンパイル処理が開始される。
このコンパイル処理の際、プローブ挿入部21は、計測対象とするメソッドのステートメントに性能計測コード(プローブ)を挿入すると共に、該ステートメントに関する情報をステートメント構文情報記憶部143に記憶する(図8、ステップS101)。
次に、ステップS101で作成された目的プログラムを実行するための指示が入力部12より入力され、その入力情報が制御部16に送信されると、プログラム実行部23は、目的プログラムを実行する。
この目的プログラムの実行の際、計測部24は、処理されるステートメントの開始や、終了を示す情報やそのときの時刻などを計測して記録する(ステップS102)。
そして、目的プログラムの実行が完了すると、ステートメント情報集計部25は、ステップS102で記録したステートメントに関する情報から、ステートメントの処理時間等を集計する。そして、ステートメント情報表示部26は、集計した情報を表示する(ステップS103)。
以上で、プロファイリング処理は終了する。
次に、概略を説明したプロファイリング処理を、図9〜図20を参照してより詳細に説明する。
(1)図8ステップS101のプローブ挿入処理:
まず、プローブ挿入部21は、記憶部14に記憶されているソースプログラムの構文を解析して、ソースプログラムを抽象構文木(AST)と呼ばれる木構造に変換する(図9、ステップS201)。なお、この処理は一般的なコンパイラの構文解析の処理によって行われる処理と実質的に同等な処理である。
ここで、図10に抽象構文木の例を示す。この図に示すように、抽象構文木は、ソースプログラムを構成するパッケージ、クラス、フィールド、メソッド、ステートメント、ブロックをノードとして、木構造で表現したものであり、ソースプログラムの構造が明確になる。
次に、プローブ挿入部21は、木構造に変換したソースプログラムから、メソッドを1つ選択する(ステップS202)。
続いて、プローブ挿入部21は、プローブ挿入対象メソッド記憶部141に記憶されている情報に基づいて、ステップS202で選択したメソッドが、プローブの挿入対象になっているか否かを判別する(ステップS203)。具体的には、ステップS202で選択したメソッドがプローブ挿入対象メソッド記憶部141に登録されている場合、プローブ挿入部21は該メソッドをプローブ挿入対象と判別する。
プローブ挿入対象のメソッドでないと判別した場合(ステップS203;No)、プローブ挿入部21は、処理をステップS210に移す。
プローブ挿入対象のメソッドであると判断した場合(ステップS203;Yes)、プローブ挿入部21は、該メソッドに含まれるステートメントを1つ選択する(ステップS204)。
続いて、プローブ挿入部21は、プローブ挿入対象ステートメント記憶部142に記憶されている情報に基づいて、ステップS204で選択したステートメントが、プローブの挿入対象になっているか否かを判別する(ステップS205)。具体的には、プローブ挿入部21は、プローブ挿入対象ステートメント記憶部142を参照して、ステップS204で選択したステートメントが属するカテゴリのプローブ挿入対象可否フラグが「可」に設定されているか否かを判別する。
プローブ挿入対象のステートメントでないと判別した場合(ステップS205;No)、プローブ挿入部21は、処理をステップS209に移す。
プローブ挿入対象のステートメントであると判断した場合(ステップS205;Yes)、プローブ挿入部21は、該ステートメントに対してステートメント番号(ID)を発行する(ステップS206)。
なお、該ステートメントがブロックを含んでいる場合には、該ブロックに対して、ブロック番号(ID)を発行する。
続いて、プローブ挿入部21は、該ステートメントに計測用のプローブを挿入する(ステップS207)。
この計測用のプローブは、挿入する位置により、ステートメント開始プローブと、ブロック開始プローブと、ステートメント終了プローブとの3つの種類に分かれる。
ステートメント開始プローブは、ステートメントの処理の開始直前の位置に挿入されるプローブであり、該ステートメントの処理が開始されたことを示す情報および、そのときの時刻(ステートメント開始時刻)とを取得して、記録する処理を行う。
ブロック開始プローブは、ステートメントがブロックを含む場合に、ブロックの処理の開始直前の位置に挿入されるプローブであり、該ブロックの処理が開始されたことを示す情報および、そのときの時刻(ブロック開始時刻)とを取得して、記録する処理を行う。
ステートメント終了プローブは、ステートメントの処理の終了直後の位置に挿入されるプローブであり、該ステートメントの処理が終了したことを示す情報および、そのときの時刻(ステートメント終了時刻)とを取得して、記録する処理を行う。
ここで、具体例を挙げてこのプローブの挿入の処理について説明する。図11は、プローブ挿入の工程を説明するための図である。
図11(A)に示すソースプログラムには、メソッド「MethodA」が記述されている。そして、このメソッド「MethodA」には、条件分岐処理を制御するステートメント「if」が含まれている。また、ステートメント「if」は、分岐条件により2つのブロックB1、B2を含んでいる。このようなソースプログラムに対して、プローブが挿入された例を図11(B)に示す。
図11(B)において、メソッド「EnterStatement」は、ステートメント開始プローブに相当し、ステートメント「IF」の処理の開始直前に挿入される。またメソッド「EnterStatement」の引数「1234」は、ステップS206の処理で当該ステートメントに付与されたステートメント番号である。
また、メソッド「EnterBlock」は、ブロック開始プローブに相当し、ステートメント「IF」に含まれるブロックB1、B2の処理の開始直前に挿入される。またメソッド「EnterBlock」の引数「1235」および「1236」は、ステップS206の処理で各ブロックに付与されたブロック番号である。
また、メソッド「ExitStatement」は、ステートメント終了プローブに相当し、ステートメント「IF」の処理の終了直後に挿入される。
図9に戻り、続いて、プローブ挿入部21は、ステップS201で抽象構文木に変換したソースプログラムを解析して、ステップS207の処理でプローブを挿入したステートメント/ブロックの親ステートメント/ブロック番号、種類(カテゴリ)、ソースプログラム名、開始位置情報、および、終了位置情報を取得する。プローブ挿入部21は、取得したこれらの情報を、ステップS206で発行したメソッド/ブロック番号に対応付けて1つのエントリとして、ステートメント構文情報記憶部143に登録する(ステップS208)。
続いて、ステップS209で、プローブ挿入部21は、ステップS204で選択していないステートメントが有るか否かを判別する。
選択していないステートメントが有ると判別した場合(ステップS209;Yes)、プローブ挿入部21は、ステップS204〜ステップS208の処理を繰り返す。
選択していないメソッドが無いと判別した場合(ステップS209;No)、プローブ挿入部21は、処理をステップS210に移す。
ステップS210で、プローブ挿入部21は、ステップS202で選択していないメソッドが有るか否かを判別する。
選択していないメソッドが有ると判別した場合(ステップS210;Yes)、プローブ挿入部21は、ステップS202に処理を移す。
選択していないメソッドが無いと判別した場合(ステップS210;No)、目的プログラム生成部22は、プローブ挿入済のソースプログラムから、目的プログラムを作成し(ステップS211)、プローブ挿入処理は終了する。
なお、この目的プログラムの作成は、一般的なコンパイラによる公知の手法によって行えばよい。すなわち、目的プログラム生成部22は、プローブ挿入済のソースプログラムから、JAVA(登録商標)仮想マシンのバイトコード(中間コード)で記述された目的プログラムを作成する。
(2)図8ステップS102の計測処理:
プログラム実行部23が、プローブ挿入済みの目的プログラムを実行して、目的プログラムのメソッドに埋め込まれているプローブが実行されると、計測部24は、メソッドに含まれるステートメントの開始時刻や終了時刻等の計測を行う(図12、ステップS301)。
そして、計測部24は、計測結果をステートメント詳細性能ログ記憶部144に記憶する(ステップS302)。
以上で計測処理は終了する。
次に、プローブの種類毎に、計測処理の動作についてより具体的に説明する。
ステートメント開始プローブが実行されると、計測部24は、そのときの時刻と、スレッド名と、ステートメント番号とを取得する(ステップS301)。なお、この時刻の取得は、例えば、制御部16が備えるタイマによって行う。また、スレッド名は、例えば、公知のAPIを実行することで取得する。また、ステートメント番号は、例えば、ステートメント開始プローブの引数に設定されているので、それを取得する。
続いて、計測部24は、取得したこれらの情報を対応付けて1つのエントリとしてステートメント詳細性能ログ記憶部144に登録する(ステップS302)。なお、このエントリの種類情報は「ステートメント開始」に設定する。また、このエントリにはユニークなログIDを発行する。
例えば、図6に示すステートメント詳細性能ログ記憶部144のログID「1」のエントリは、ステートメント開始プローブが実行されたことにより作成されたエントリである。
また、ブロック開始プローブが実行されると、計測部24は、そのときの時刻と、スレッド名と、ブロック番号とを取得する(ステップS301)。なお、スレッド名は、例えば、公知のAPIを実行することで取得する。またブロック番号は、例えば、ブロック開始プローブの引数に設定されているので、それを取得する。
続いて、計測部24は、取得したこれらの情報を対応付けて1つのエントリとしてステートメント詳細性能ログ記憶部144に登録する(ステップS302)。なおこの際、このエントリの種類情報は「ブロック開始」に設定する。また、このエントリにはユニークなログIDを発行する。
例えば、図6に示すステートメント詳細性能ログ記憶部144のログID「2」のエントリは、ブロック開始プローブが実行されたことにより作成されたエントリである。
また、ステートメント終了プローブが実行されると、計測部24は、そのときの時刻と、スレッド名と、ステートメント番号とを取得する(ステップS301)。なお、スレッド名は、例えば、公知のAPIを実行することで取得する。またステートメント番号は、例えば、ステートメント終了プローブの引数に設定されているので、それを取得する。
続いて、計測部24は、取得したこれらの情報を対応付けて1つのエントリとしてステートメント詳細性能ログ記憶部144に登録する(ステップS302)。なおこの際、このエントリの種類情報は「ステートメント終了」に設定する。また、このエントリにはユニークなログIDを発行する。
例えば、図6に示すステートメント詳細性能ログ記憶部144のログID「4」のエントリは、ステートメント終了プローブが実行されたことにより作成されたエントリである。
以上で、計測処理は終了する。
(3)図8ステップS103の集計・表示処理:
まず、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から、先頭のエントリを1つ読み込む(図13、ステップS401)。
次に、ステートメント情報集計部25は、ステップS401で読み込んだエントリの種類情報が「ステートメント終了」を表す情報であるか否かを判別する(ステップS402)。
エントリの種類情報が「ステートメント終了」を表す情報でないと判別した場合(ステップS402;No)、ステップS401で読み込んだエントリの種類情報は、「ステートメント開始」又は「ブロック開始」を表す情報となる。そして、ステートメント情報集計部25は、このエントリに含まれるスレッドの識別情報(スレッド名)を取得する(ステップS403)。
続いて、ステートメント情報集計部25は、ステップS403で取得したスレッド名に対応付けられているスタックに、このエントリのログIDを積む(ステップS404)。なお、スレッド名に対応付けられているスタックが無い場合には、ステートメント情報集計部25は、該スレッド名に対応付けたスタックを作成し、そのスタックに、ログIDを積む。
そして、ステートメント情報集計部25は、処理をステップS401に移し、ステートメント詳細性能ログ記憶部144から、次の先頭のエントリを1つ読み込み、ステップS402からの処理を繰り返す。
ステップS402で、エントリの種類情報が「ステートメント終了」を表す情報であると判別した場合(ステップS402;Yes)、ステートメント情報集計部25は、このエントリに含まれるスレッドの識別情報(スレッド名)を取得する(ステップS405)。
そして、ステートメント情報集計部25は、ステップS405で取得したスレッド名に対応付けられているスタックから、スタックの先頭に積まれているステートメント詳細性能ログ記憶部144のログIDを取り出す(ステップS406)。
続いて、ステートメント情報集計部25は、ステップS406で取り出したログIDから、ステートメント詳細性能ログ記憶部144のエントリを特定し、特定したエントリの種類情報が「ステートメント開始」を表す情報か「ブロック開始」を表す情報のどちらであるかを判別する(ステップS407)。
ステップS407で、エントリの種類情報が「ステートメント開始」を表す情報であると判別した場合、ステートメント情報集計部25は、処理をステップS408に移す。
ステップS407で、エントリの種類情報が「ブロック開始」を表す情報であると判別した場合、ステートメント情報集計部25は、図15(A)に示すブロック処理時間算出・記録処理を開始する(図14、ステップS410)。
ブロック処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部25は、ステップS402で種類情報が「ステートメント終了」を示すと判断したエントリに含まれる実行時間(即ち、ステートメントの終了時間)を取得する(ステップS4101)。
次に、ステートメント情報集計部25は、ステップS407で、種類情報が「ブロック開始」を示すと判断したエントリに含まれる実行時間(即ちブロックの開始時間)を取得する(ステップS4102)。
そして、ステートメント情報集計部25は、取得したステートメントの終了時間からブロックの開始時間を減算した時間をブロックの処理時間として算出する(ステップS4103)。
そして、ステートメント情報集計部25は、算出したブロックの処理時間と、当該ブロックの識別情報(ブロック番号等)とを対応付けてRAM163に記録する(ステップS4104)。
以上で、ブロック処理時間算出・記録処理(ステップS410)は終了する。
図14に戻り、続いて、ステートメント情報集計部25は、ステップS406でログIDを取り出したスタックと同じスタックから、スタックの先頭に積まれているログIDを取り出す(ステップS411)。
そして、ステートメント情報集計部25は、ステップS411で取り出したログIDから、ステートメント詳細性能ログ記憶部144のエントリを特定し、特定したエントリの種類情報が「ステートメント開始」を表す情報か「ブロック開始」を表す情報のどちらであるかを判別する(ステップS412)。
ステップS412で、エントリの種類情報が「ブロック開始」を表す情報であると判別した場合、ステートメント情報集計部25は、図15(B)に示すブロック処理時間算出・記録処理を開始する(ステップS413)。
ブロック処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部25は、ステップS410、または、前回のステップS413の処理によって処理時間を求めたブロックの処理開始時間(前ブロックの開始時間)を取得する(ステップS4131)。
次に、ステートメント情報集計部25は、ステップS412で種類情報が「ブロック開始」を示すと判断したエントリに含まれる処理時間(ブロックの開始時間)を取得する(ステップS4132)。
そして、ステートメント情報集計部25は、取得した前ブロックの開始時間からブロックの開始時間を減算した時間をブロックの処理時間として算出する(ステップS4133)。
そして、ステートメント情報集計部25は、算出したブロックの処理時間と、当該ブロックの識別情報(ブロック番号等)とを対応付けてRAM163に記録する(ステップS4134)。
以上で、ブロック処理時間算出・記録処理(ステップS413)は終了する。図14に戻り、続いて、ステートメント情報集計部25は、処理をステップS411に移す。
ステップS412で、エントリの種類情報が「ステートメント開始」を表す情報であると判別した場合、ステートメント情報集計部25は、図16(A)に示すステートメント内部処理時間算出・記録処理を開始する(ステップS414)。
ステートメント内部処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部25は、ステップS410、または、ステップS413の処理によって処理時間を求めたブロックの開始時間(ブロックの開始時間)を取得する(ステップS4141)。
次に、ステートメント情報集計部25は、ステップS412で、種類情報が「ステートメント開始」を示すと判断したエントリに含まれる実行時間(即ちステートメントの開始時間)を取得する(ステップS4142)。
そして、ステートメント情報集計部25は、取得したブロックの開始時間からステートメントの開始時間を減算した時間を、ステートメントの内部処理時間として算出する(ステップS4143)。
そして、ステートメント情報集計部25は、算出したステートメントの内部処理時間と、当該ステートメントの識別情報(ステートメント番号等)とを対応付けてRAM163に記録する(ステップS4144)。
以上で、ステートメント内部処理時間算出・記録処理(ステップS414)は終了する。図13に戻り、続いて、ステートメント情報集計部25は、処理をステップS408に移す。
ステップS408で、ステートメント情報集計部25は、図16(B)に示すステートメント処理時間算出・記録処理を開始する。
ステートメント処理時間算出・記録処理が開始されると、まず、ステートメント情報集計部25は、ステップS402で種類情報が「ステートメント終了」を示すと判断したエントリに含まれる処理時間(即ち、ステートメントの終了時間)を取得する(ステップS4081)。
次に、ステートメント情報集計部25は、ステップS407、又はステップS412で、種類情報が「ステートメント開始」を示すと判断したエントリに含まれる実行時間(即ちステートメントの開始時間)を取得する(ステップS4082)。
そして、ステートメント情報集計部25は、取得したステートメントの終了時間から、ステートメントの開始時間を減算した時間をステートメントの処理時間として算出する(ステップS4083)。
そして、ステートメント情報集計部25は、算出したステートメントの処理時間と、当該ステートメントの識別情報(ステートメント番号等)とを対応付けてRAM163に記録する(ステップS4084)。
以上で、ステートメント処理時間算出・記録処理(ステップS408)は終了する。
図13に戻り、続いて、ステートメント情報集計部25は、読み込んでいないステートメント詳細性能ログ記憶部144のエントリが有るか否かを判別する(ステップS409)。
読みこんでいないエントリが有ると判別した場合(ステップS409;Yes)、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から先頭のエントリを取得し(ステップS401)、以下ステップS402からの処理を繰り返す。
読みこんでいないエントリがないと判別した場合(ステップS409;No)、ステートメント情報集計部25は、上述の一連の処理でRAM163に記憶してきたステートメントの処理時間、内部処理時間と、ブロックの処理時間とを一覧表示する画面を出力部13に表示する(ステップS415)。
以上で集計・表示処理は終了する。
続いて、具体例を挙げて、この集計・表示処理について説明する。
具体例として、ステートメント詳細性能ログ記憶部144には、図17に示すような情報が記憶されているものとする。すなわち、ステートメント番号S1を有するステートメント(以下、ステートメント「S1」とする)が開始された後、ブロック番号B1を表すブロック(以下、ブロック「B1」とする)と、ブロック「B2」とが実行され、その後ステートメント「S2」が開始、終了した後、ステートメント「S1」が終了していることが、このステートメント詳細性能ログ記憶部144に記録されている。
このようなステートメント詳細性能ログ記憶部144の状態で集計・表示処理が開始されると、まず、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から、先頭のエントリ即ちログID「1」のエントリを読み込む(ステップS401)。
そして、読み込んだエントリの種類情報は、「ステートメント開始」であるため(ステップS402;No)、処理をステップS403に移し、そのエントリのスレッド名「#1」を取得する(ステップS403)。
そして、取得したスレッド名「#1」に関連付けたスタックを作成し、作成したスタックにこのエントリのログID「1」を、図18(A)に示すように積む(ステップS404)。
そして、ステップS401の処理に戻り、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から、先頭のエントリを読み出し(ステップS401)、種類が「ステートメント終了」以外のエントリは、該エントリのスレッド名を取得し(ステップS403)、取得したスレッド名に関連付けられているスレッドに、該エントリのログIDを積む(ステップS404)。すなわち、以下ログID「2」〜「4」を有するエントリに対して、順にステップS401〜S404の処理が繰り返され、そのエントリのログIDがスタックに積まれ、スレッド名「#1」に関連付けられたスタックは図18(B)に示すような状態になる。
続いて、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から、先頭のエントリ即ちログID「5」のエントリを読み込む(ステップS401)。
読み込んだエントリの種類情報は、「ステートメント終了」であるため(ステップS402;Yes)、処理をステップS405に移し、そのエントリのスレッド名「#1」を取得する(ステップS405)。
そして、ステートメント情報集計部25は、取得したスレッド名「#1」に対応付けられている、図18(B)に示すような状態のスタックから、先頭に積まれているログID「4」を取り出す(ステップS406)。
よって、この処理により、スタックは図18(C)に示すような状態になる。
取り出したログID「4」を有するエントリの種類情報は、「ステートメント開始」であるため、ステートメント情報集計部25は、ステートメント処理時間算出・記録処理を開始する(ステップS408)。
ステートメント処理時間算出・記録処置が開始されると、ステートメント情報集計部25は、ステップS402で種類情報が「ステートメント終了」を示すと判断したログID「5」を有するエントリに含まれる実行時間(ステートメント終了時間)「2100」を取得する(ステップS4081)。
そして、ステートメント情報集計部25は、ステップS407で種類情報が「ステートメント開始」を示すと判断したログID「4」を有するエントリに含まれる実行時間(ステートメント開始時間)「1600」とステートメント番号「S2」とを取得する(ステップS4082)。
そして、ステートメント情報集計部25は、取得したステートメント終了時間「2100」からステートメント開始時間「1600」を減算した時間「500」をステートメント番号「S2」を有するステートメントの処理時間として算出する(ステップS4083)。
そして、ステートメント情報集計部25は、算出したステートメントの処理時間「500」と、ステートメント番号「S2」とを対応付けてRAM163に図19のL1に示すように記憶する(ステップS4104)。
以上でステートメント処理時間算出・記録処理は終了する。
続いて、ステートメント情報集計部25は、ステートメント詳細性能ログ記憶部144から、先頭のエントリ即ちログID「6」のエントリを読み込む(ステップS401)。
読み込んだエントリの種類情報は、「ステートメント終了」であるため(ステップS402;Yes)、処理をステップS405に移し、そのエントリのスレッド名「#1」を取得する(ステップS405)。
そして、ステートメント情報集計部25は、取得したスレッド名「#1」に対応付けられている図18(C)に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部144のログID「3」を取り出す(ステップS406)。
よって、この処理により、スタックは図18(D)に示すような状態になる。
取り出したログID「3」を有するエントリの種類情報は、「ブロック開始」であるため、ステートメント情報集計部25は、ブロック処理時間算出・記録処理を開始する(ステップS410)。
ブロック処理時間算出・記録処理が開始されると、ステートメント情報集計部25は、ステップS402で種類情報が「ステートメント終了」を示すと判断したログID「6」を有するエントリに含まれる実行時間(ステートメント終了時間)「2800」を取得する(ステップS4101)。
そして、ステートメント情報集計部25は、ステップS407で種類情報が「ブロック開始」を示すと判断したログID「3」を有するエントリに含まれる実行時間(ブロック開始時間)「1450」とブロック番号「B2」とを取得する(ステップS4102)。
そして、ステートメント情報集計部25は、取得したステートメント終了時間「2800」からブロック開始時間「1450」を減算した時間「1350」をブロック「B2」を有するブロックの処理時間として算出する(ステップS4103)。
そして、ステートメント情報集計部は、算出したブロックの処理時間「1350」と、ブロック番号「B2」とを対応付けて、RAM163に図19のL2に示すように記憶する(ステップS4104)。
以上で、ブロック処理時間算出・記録処理は終了する。
そして、ステートメント情報集計部25は、取得したスレッド名「#1」に対応付けられている図18(D)に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部144のログID「2」を取り出す(ステップS411)。
よって、この処理により、スタックは図18(E)に示すような状態になる。
取り出したログID「2」を有するエントリの種類情報は、「ブロック開始」であるため、ステートメント情報集計部25は、ブロック処理時間算出・記録処理を開始する(ステップS413)。
ブロック処理時間算出・記録処理が開始されると、ステートメント情報集計部25は、ステップS410の処理によって処理時間を求めたブロックの開始時間(前ブロック開始時間)「1450」を取得する(ステップS4131)。
そして、ステートメント情報集計部25は、ステップS412で種類情報が「ブロック開始」を示すと判断したログID「2」を有するエントリに含まれる実行時間(ブロック開始時間)「1200」および、ブロック番号「B1」を取得する(ステップS4132)。
そして、ステートメント情報集計部25は、取得した前ブロック開始「1450」からブロック開始時間「1200」を減算した時間「250」を、ブロック番号「B1」を有するブロックの処理時間として算出する(ステップS4133)。
そして、ステートメント情報集計部25は、算出したブロックの処理時間「250」と、ブロック番号「B1」とを対応付けて、RAM163に図19のL3に示すように記憶する(ステップS4134)。
以上でブロック処理時間算出・記録処理は終了する。
続いて、ステートメント情報集計部25は、ステップS411に戻り、スレッド名「#1」に対応付けられている図18(E)に示すような状態のスタックから、先頭に積まれているステートメント詳細性能ログ記憶部144のログID「1」を取り出す(ステップS411)。
よって、この処理により、スタックは図18(F)に示すような状態になる。
取り出したログID「1」を有するエントリの種類情報は、「ステートメント開始」であるため、ステートメント情報集計部25は、ステートメント内部処理時間算出・記録処理を開始する(ステップS414)。
ステートメント内部処理時間算出・記録処理が開始すると、ステートメント情報集計部25は、前回のステップS413の処理によって処理時間を求めたブロックの開始時間(ブロック開始時間)「1200」を取得する(ステップS4141)。
そして、ステートメント情報集計部25は、ステップS412で種類情報が「ステートメント開始」を示すと判断したログID「1」を有するエントリに含まれる実行時間(ステートメント開始時間)「1000」および、ステートメント番号「S1」を取得する(ステップS4142)。
そして、ステートメント情報集計部25は、取得したブロック開始時間「1200」からステートメント開始時間「1000」を減算した時間「200」をステートメント番号「S1」を有するステートメントの内部処理時間として算出する(ステップS4143)。
そして、ステートメント情報集計部25は、算出したステートメントの内部処理時間「200」と、ステートメント番号「S1」とを対応付けて、RAM163に図19のL4に示すように記憶する(ステップS4144)。
以上でステートメント内部処理時間算出・記録処理は終了する。
続いて、ステートメント情報集計部25は、ステートメントの処理時間算出・記録処理を開始する(ステップS408)。
ステートメント処理時間算出・記録処置が開始されると、ステートメント情報集計部25は、ステップS402で種類情報が「ステートメント終了」を示すと判断したログID「6」を有するエントリに含まれる実行時間(ステートメント終了時間)「2800」を取得する(ステップS4081)。
そして、ステートメント情報集計部25は、ステップS412で種類情報が「ステートメント開始」を示すと判断したログID「1」を有するエントリに含まれる実行時間(ステートメント開始時間)「1000」とステートメント番号「S1」とを取得する(ステップS4082)。
そして、ステートメント情報集計部25は、取得したステートメント終了時間「2800」からステートメント開始時間「1000」を減算した時間「1800」をステートメント番号「S1」を有するステートメントの処理時間として算出する(ステップS4083)。
そして、ステートメント情報集計部25は、算出したステートメントの処理時間「1800」と、ステートメント番号「S1」とを対応付けて、RAM163に図19のL5に示すように記憶する。
以上でステートメント処理時間算出・記録処理は終了する。
続いて、ステートメント詳細性能ログ記憶部144に読み込んでいないエントリがないため(ステップS409;No)、ステートメント情報集計部25は、RAM163に記憶してきた、ステートメントの処理時間、内部処理時間と、ブロックの処理時間とを一覧表示する図20に示すような画面を表示して、集計・表示処理は終了する。
なお、この画面に表示されているステートメントやブロックの種類や、ステートメントやブロックがどのステートメントから呼ばれているのかの関係を示す情報やメソッド名等は、ステートメント構文情報記憶部143を参照して取得すればよい。
以上説明したように、この実施の形態では、ソースプログラムをコンパイルする際に、メソッドの構文情報を解析し、計測対象のステートメントに対して、計測用のプローブを挿入する。そして、プローブが挿入されたプログラム(目的プログラム)を実行する際、計測用のプローブの処理によりステートメントの処理が実行される度に、その処理時間を計測する。
そのため、メソッドの処理時間の算出を、ステートメントの処理単位で行うことができる。
また、ソースプログラムに挿入する計測用のプローブは、ステートメントの処理の開始、終了時点および、ブロックの開始時点に挿入し、ブロックの終了時点には挿入しない。そのため、挿入するプローブの数を少なくすることができ、プロファイリング処理による実行環境への負荷は小さくなり、より実際の実行環境に近い条件で計測を行うことができる。
なお、この発明は上記実施の形態に限定されず、様々な応用が可能である。
例えば、本実施形態では、プローブ挿入対象メソッド記憶部141に登録されているメソッドに対してのみプローブの挿入を行ったが、プログラムを構成する全てのメソッドにプローブを挿入してもよい。この場合は、プローブ挿入対象メソッド記憶部141を備える必要はない。
また、本実施形態では、プローブ挿入対象ステートメント記憶部142に登録されている種類(カテゴリ)のステートメントに対してのみプローブの挿入を行ったが、全ての種類(カテゴリ)のステートメントにプローブを挿入してもよい。この場合は、プローブ挿入対象ステートメント記憶部142を備える必要はない。
また、本実施形態では、コンパイルの際に、構文情報を解析し、プローブを挿入し、プローブを挿入したプローブの構文情報をステートメント構文情報記憶部143に記憶したが、コンパイル時に必ずしもこの処理を行う必要はない。例えば、ソースプログラムの編集の際に、上述の処理を行ってもよい。
また、本実施形態では、ステートメント詳細性能ログ記憶部144に記憶されている情報から、ステートメント/ブロックの処理時間を集計する際にスタックを利用して集計したが、これに限る必要はない。
例えば、ステートメント詳細性能ログ記憶部144に記憶されている情報から、以下の(a)〜(c)に示すような方法で、処理時間を求めてもよい。
(a)ステートメントの処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ステートメント開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名、ステートメント番号であり、種類情報「ステートメント終了」を有するエントリが最初に見付かった時点で、両者のエントリに含まれる実行時間の差を該ステートメントの処理時間として求める。
(b)ブロックの処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ブロック開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名であり、種類情報「ブロック開始」又は「ステートメント終了」を有するエントリを最初に読み込んだ時点で、両者のエントリに含まれる実行時間の差を、最初に読み込んだ方のエントリに対応するブロックの処理時間として求める。
(c)ステートメントの内部処理時間の算出方法
エントリを先頭から読み込んでいく。そして、種類情報「ステートメント開始」を有するエントリを読み込んだ後、このエントリと同一のスレッド名であり、種類情報「ブロック開始」を有するエントリが最初に読み込んだ時点で、両者のエントリに含まれる実行時間の差を、該ステートメントの内部処理時間として求める。
また、本実施形態でプロファイリングの対象とするソースプログラムの言語をJAVA(登録商標)としたが、これに限るものではなく、例えばFORTRANやC言語やVISUAL BASIC(登録商標)等の他のプログラム言語をプロファイリングの対象としてもよい。
なお、本発明のプログラムプロファイリング装置は、専用のハードウェアに限られるものではなく、通常のコンピュータシステムによっても実現することができる。
具体的には、上記実施の形態では、プログラムプロファイリング装置のプログラムが、メモリ等に予め記憶されているものとして説明した。しかし、上述の処理動作を実行させるためのプログラムを、フレキシブルディスク、CD−ROM(Compact Disk Read-Only Memory)、DVD(Digital Versatile Disk)、MO(Magneto-Optical disk)等のコンピュータ読み取り可能な記録媒体に格納して配布し、そのプログラムをコンピュータにインストールすることにより、上述の処理を実行するプログラムプロファイリング装置を構成してもよい。
また、プログラムをインターネット等の通信ネットワーク上のサーバ装置が有するディスク装置等に格納しておき、例えば、搬送波に重畳させて、コンピュータにダウンロード等するようにしてもよい。さらに、通信ネットワークを介してプログラムを転送しながら起動実行することによっても、上述の処理を達成することができる。
また、上述の機能を、OS(Operating System)が分担又はOSとアプリケーションの協働により実現する場合等には、OS以外の部分のみを媒体に格納して配布してもよく、また、コンピュータにダウンロード等してもよい。
本発明の実施の形態に係るプログラムプロファイリング装置の構成例を示すブロック図である。 図1に示したプログラムプロファイリング装置の記憶部の構成を示す図である。 プローブ挿入対象メソッド記憶部の構成を示す図である。 プローブ挿入対象ステートメント記憶部の構成を示す図である。 ステートメント構文情報記憶部の構成を示す図である。 ステートメント詳細性能ログ記憶部の構成を示す図である。 本発明の実施の形態に係るプログラムプロファイリング装置の機能構成例を示すブロック図である。 プロファイリング処理の動作を説明するためのフローチャートである。 プローブ挿入処理の動作を説明するためのフローチャートである。 抽象構文木の例を示した図である。 プローブの挿入を説明するための図である。 計測処理の動作を説明するためのフローチャートである。 集計・表示処理の動作を説明するためのフローチャートである。 集計・表示処理の動作を説明するためのフローチャートである。 ブロック処理時間算出・記録処理の動作を説明するためのフローチャートである。 (A)は、ステートメント内部処理時間算出・記録処理の動作を説明するためのフローチャートである。(B)は、ステートメント処理時間算出・記録処理の動作を説明するためのフローチャートである。 集計・表示処理の具体例において、集計処理の対象とするステートメント詳細性能ログ記憶部144のエントリを示した図である。 集計・表示処理の具体例を説明するための図である。 集計・表示処理によってRAM163に記憶される情報の例を示した図である。 ステートメント、ブロックの処理時間を一覧表示する画面の例を示した図である。
符号の説明
1 プログラムプロファイリング装置
141 プローブ挿入対象メソッド記憶部
142 プローブ挿入対象ステートメント記憶部
143 ステートメント構文情報記憶部
144 ステートメント詳細性能ログ記憶部
21 プローブ挿入部
22 目的プログラム生成部
23 プログラム実行部
24 計測部
25 ステートメント情報集計部
26 ステートメント情報表示部

Claims (6)

  1. 1つ又は複数のメソッドを含むソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段と、
    前記ステートメント特定手段によって特定されたステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段と、
    前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記プローブが挿入されたステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段と、
    前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段と、
    前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段と、
    ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段と、を備え
    前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
    ことを特徴とする、プログラムプロファイリング装置。
  2. 前記ソースプログラムを構成するメソッドのうち、前記プローブの挿入対象とするメソッドの識別情報を記憶するプローブ挿入対象メソッド記憶手段をさらに備え、
    前記プローブ挿入手段は、前記プローブ挿入対象メソッド記憶手段に識別情報が記憶されているメソッドに含まれる前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
    ことを特徴とする、請求項1に記載のプログラムプロファイリング装置。
  3. 前記プローブ挿入手段で処理の前後にプローブを挿入するステートメントがブロックを有している場合、該ブロックの処理の前に、該ブロックの処理時間を計測するためのブロック用プローブを挿入する、ブロック用プローブ挿入手段と、
    前記プローブ挿入手段と前記ブロック用プローブ挿入手段とによってプローブとブロック用プローブとが挿入されたソースプログラムをコンパイルして作成された目的プログラムの実行により前記ブロック用プローブを挿入したブロックの処理が開始する度に、該ブロックの開始を表す情報とそのときの時刻と該ブロックの処理が属するスレッドの識別情報とを対応付けて記憶するブロック情報記憶手段と、
    前記ステートメント情報記憶手段と前記ブロック情報記憶手段とに記憶されている情報に基づいて、ブロックの処理時間を算出するブロック処理時間算出手段と、をさらに備え、
    前記処理時間表示手段は、前記ブロック処理時間算出手段で算出したブロックの処理時間を表示する、
    ことを特徴とする、請求項1又は2に記載のプログラムプロファイリング装置。
  4. 前記ステートメント情報記憶手段と前記ブロック情報記憶手段に記憶されている情報とに基づいて、前記ブロックを有するステートメントの処理時間から該ブロックの処理時間を除いた処理時間を該ステートメントの内部処理時間として算出する、内部処理時間算出手段をさらに備え、
    前記処理時間表示手段は、前記内部処理時間算出手段で算出したステートメントの内部処理時間を表示する、
    ことを特徴とする、請求項に記載のプログラムプロファイリング装置。
  5. 複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定ステップと、
    前記ステートメント特定ステップで特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入ステップと、
    前記プローブ挿入ステップによってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入ステップでプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶ステップと、
    前記ステートメント情報記憶ステップによって記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出ステップと、
    前記ステートメント処理時間算出ステップで算出したステートメントの処理時間を表示する処理時間表示ステップと、
    ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶ステップと、を備え、
    前記プローブ挿入ステップでは、前記ステートメント特定ステップで特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶ステップによって記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
    ことを特徴とするプログラムプロファイリング方法。
  6. コンピュータを、
    複数のメソッドから構成されたソースプログラムを解析して、メソッドに含まれるステートメントを特定する、ステートメント特定手段、
    前記ステートメント特定手段で特定したステートメントの処理の前後に、処理時間を計測するためのプローブを挿入するプローブ挿入手段、
    前記プローブ挿入手段によってプローブが挿入されたソースプログラムをコンパイルして作成された目的プログラムを実行した際の、前記プローブ挿入手段でプローブを挿入したステートメントの処理が開始又は終了する毎に、該ステートメントの処理が開始か終了かを表す情報とそのときの時刻と該ステートメントの処理が属するスレッドの識別情報とを対応付けて記憶するステートメント情報記憶手段、
    前記ステートメント情報記憶手段に記憶されている情報に基づいて、ステートメントの処理時間を算出するステートメント処理時間算出手段、
    前記ステートメント処理時間算出手段で算出したステートメントの処理時間を表示する処理時間表示手段、
    ステートメントのカテゴリ毎に、該カテゴリに属するステートメントを前記プローブの挿入対象とするか否かを示す管理情報を記憶するプローブ挿入対象ステートメント記憶手段、
    して機能させるプログラムであって、
    前記プローブ挿入手段は、前記ステートメント特定手段で特定したステートメントであって、そのカテゴリに属するステートメントを前記プローブの挿入対象とすることを示す管理情報が前記プローブ挿入対象ステートメント記憶手段に記憶されているステートメントの処理の前後に、処理時間を計測するためのプローブを挿入する、
    ことを特徴とするプログラム。
JP2007179079A 2007-07-06 2007-07-06 プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム Expired - Fee Related JP4860564B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2007179079A JP4860564B2 (ja) 2007-07-06 2007-07-06 プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007179079A JP4860564B2 (ja) 2007-07-06 2007-07-06 プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム

Publications (2)

Publication Number Publication Date
JP2009015734A JP2009015734A (ja) 2009-01-22
JP4860564B2 true JP4860564B2 (ja) 2012-01-25

Family

ID=40356543

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007179079A Expired - Fee Related JP4860564B2 (ja) 2007-07-06 2007-07-06 プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム

Country Status (1)

Country Link
JP (1) JP4860564B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4465405B2 (ja) 2008-02-27 2010-05-19 Hoya株式会社 フォトマスクブランクおよびフォトマスク並びにこれらの製造方法
JP6247237B2 (ja) * 2015-01-30 2017-12-13 日本電信電話株式会社 オートリソースロギングシステム、オートリソースロギング方法及びプログラム

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2002259167A (ja) * 2000-12-26 2002-09-13 Fujitsu Ltd 実行性能情報の提示方法、及び記録媒体
JP2003140928A (ja) * 2001-11-02 2003-05-16 Fujitsu Ltd 仮想マシン内部情報自動取得システム
JP2004287869A (ja) * 2003-03-24 2004-10-14 Hitachi Ltd プログラム実行監視装置および方法
JP2005352894A (ja) * 2004-06-11 2005-12-22 Nec Corp 性能解析プログラム及び性能解析プログラムの生成方法

Also Published As

Publication number Publication date
JP2009015734A (ja) 2009-01-22

Similar Documents

Publication Publication Date Title
CN110059009B (zh) 用于测试代码文件的方法和装置
US5987250A (en) Transparent instrumentation for computer program behavior analysis
US20130080993A1 (en) Embedded system performance
US20090248721A1 (en) System And Method for Stack Crawl Testing and Caching
JP5583514B2 (ja) バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
JP2015043198A (ja) 解析システム、解析方法および解析プログラム
JP2003050715A (ja) コンパイラおよびデバッグ装置
KR20110070468A (ko) 인스트루먼테이션 실행 장치 및 방법
JP2004164554A (ja) プログラム実行監視装置および方法
JP4905974B2 (ja) プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム
US9134979B2 (en) Convergence analysis in multithreaded programs
JP2013008277A (ja) カバレッジ測定装置、方法およびプログラム
JP2018156133A (ja) コンパイラプログラム、情報処理装置およびコンパイル方法
JP4860564B2 (ja) プログラムプロファイリング装置、プログラムプロファイリング方法、及びプログラム
JP2007018254A (ja) 言語処理装置
JP2009237610A (ja) コード変換装置及びコード変換方法
JP4867864B2 (ja) 性能データ収集・表示システム、性能データ表示装置、そのプログラム
US8756580B2 (en) Instance-based field affinity optimization
JP2005339204A (ja) 情報処理装置およびプログラムのテスト方法
JPWO2017204139A1 (ja) データ処理装置、データ処理方法、およびプログラム記録媒体
JP2008250838A (ja) ソフトウェア生成装置、方法、およびプログラム
US20100077384A1 (en) Parallel processing of an expression
JP2007018313A (ja) 回路設計プログラム、回路設計装置、回路設計方法
JP2006202134A (ja) プロファイル情報収集方法および装置
JP6834457B2 (ja) エミュレーション性能算出装置、エミュレーション性能算出システム、エミュレーション性能算出方法、および、エミュレーション性能算出プログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100324

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110630

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110712

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110909

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20111004

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20111102

R150 Certificate of patent or registration of utility model

Ref document number: 4860564

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20141111

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees