(57)【要約】【課題】  従来技術においては、アプリケーションプログラムの性能プロファイリングを実施する場合は、当該アプリケーションプログラムの中で性能プロファイリングを実施したい部分（関数あるいはルーチン）の前後に、性能プロファイリング開始呼び出し(201)、性能プロファイリング終了呼び出し(203)および性能プロファイリング関数prof(210)をそれぞれ必要な組合わせ分付加したアプリケーションプログラムを準備する必要があった。【解決手段】  本発明では、情報処理装置内の命令プロセッサに組み込まれている、ハードウェアモニタと呼ばれるCPU性能プロファイリングのための論理、およびその論理で提供されるある一定の閾値を超える回数の測定イベントが発生した際に割込みを発生する機能と、アプリケーションプログラムの性能プロファイリングを実施するための割込み処理ハンドラを用いる事で、上述の課題を解決するものである。【選択図】  図１
2005215816.tif 000002
【特許請求の範囲】
【請求項１】
情報処理装置のソフトウェアの性能プロファイリング方法について、アプリケーションプログラムを構成する個々の関数あるいはルーチンの実行時間を計測し比較することでどの関数あるいはルーチンが実行時間を消費しているかを判定するプロファイリング方法において、
情報処理装置内の命令プロセッサに組み込まれているハードウェアモニタと呼ばれるプロセッサ性能プロファイリングのための論理で、該論理により提供されるある一定の閾値を超える回数の測定イベントが発生した際に割込みを発生させる手段と、該割込みが発生した際に起動される割込み処理手段と、を用い、
該割込みが発生した際に起動される割込み処理手段において、アプリケーションプログラム内のどの関数あるいはルーチンで該割込みが発生したかを割込み発生時点での実行アドレスより求め、個々の関数あるいはルーチンでの該割込み発生回数を数えることでアプリケーションプログラムの性能プロファイリング情報を蓄積し、個々の関数あるいはルーチンでの該割込み発生回数を比較することで、どの関数あるいはルーチンでより多くの実行時間を消費しているかを判定することにより、
該アプリケーションプログラムに対してプログラムの追加・変更、再コンパイルあるいは再起動を行う事無く性能プロファイリング情報を採取することを特徴とするソフトウェアの性能プロファイリング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置のソフトウェアの性能測定に関し、特にソフトウェアを構成する関数・ルーチンの性能プロファイリング方法およびこの方法を実現する装置に関するものである。
【背景技術】
【０００２】
アプリケーションプログラムの処理性能を向上させるには、アプリケーションプログラムを構成する関数あるいは処理ルーチンの中で実行時間をより多く消費しているものから最適化し、実行時間を短縮する事が求められる。このアプリケーションプログラム最適化の情報を得るための方法の一つとして、アプリケーションプログラム中の各関数あるいは処理ルーチン毎にどれだけのCPU実行時間を費やしたかを記録する「性能プロファイリング」と呼ばれる物がある。
【０００３】
図6に従来の性能プロファイリング方法の例を示す。
図6において200は情報処理装置上でアプリケーションプログラムが配置されるプログラムメモリ領域を示している。200上にはアプリケーションプログラムを構成する関数の一つである関数func_a(202)およびfunc_b(205)がそれぞれ配置されている。またアプリケーションプログラムを構成する関数とは別に、性能プロファイリング用の関数210が同様に200上に配置されている。さらに、関数func_a(202)およびfunc_b(205)の前後にはそれぞれprof(210)を呼び出すための性能プロファイリング開始呼び出し(201,204)および性能プロファイリング終了呼び出し(203,206)が付加され配置されている。
【０００４】
アプリケーションプログラムの処理が関数func_a(202)に到達すると、情報処理装置は202の実行を開始する前に201を実行し、性能プロファイリング関数prof(210)中の性能プロファイリング開始ルーチンを呼び出す。当該ルーチンは図7に示す様に、先ず呼び出し元の関数（この場合は202）を特定(251)し、現在のハードウェア時計の示す時刻を202が開始された時刻として保存(252)し、呼び出し元関数202へ処理を復帰する。引き続き情報処理装置が202の実行を継続しその処理を終了すると、203を実行して210中の性能プロファイリング終了ルーチンを呼び出す。当該ルーチンは図8に示す様に、先ず呼び出し元の関数（この場合は202）を特定(261)し、現在の時刻を202の実行が終了した時刻として保存し(262)、先に保存されていた202の開始時刻との差分より202の実行時間を求め(263)、プロファイル情報を保存先(211)へ蓄積(264)する。この一連の処理と同様の事を関数func_b(205)の実行時にも行い、各々の関数について実行時間を蓄積して行く。
【０００５】
上述の一連の処理を繰り返し、情報処理装置がアプリケーションプログラムの実行を終了した後、目的とする性能プロファイリング情報は211に蓄積されている。211に蓄積された性能プロファイリング情報は、例えば図9に示される様な一覧表の形で各々の関数202,205について、その処理時間の合計およびアプリケーションプログラム全実行時間に対する該関数実行時間の割合という形で表示される。この情報を元に全関数の中でより多くの実行時間を費やしている関数を特定し、当該アプリケーションプログラムの処理性能を向上するために最適化が必要な部位を見極めるための方針を提供することが出来る。
【０００６】
なお、上述の例では各関数func_a(202)、func_b(205)に対して性能プロファイリングを実施した場合を示しているが、201および203を任意の位置に付加することにより、アプリケーションプログラム中の任意の部分の実行時間を計測することが可能である。
【０００７】
【特許文献１】特開2000-47902号公報
【０００８】
【非特許文献１】「IBM AIX 5L V5.2 コマンド・リファレンス 第2巻 (dからh)」邦文資料番号SC88-6970-03および英文資料番号SC23-4116-05
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかし、上述の例で示した通り、従来技術においてアプリケーションプログラムの性能プロファイリングを実施する場合は、当該アプリケーションプログラムの中で性能プロファイリングを実施したい部分（関数あるいはルーチン）の前後に、性能プロファイリング開始呼び出し(201)、性能プロファイリング終了呼び出し(203)および性能プロファイリング関数prof(210)をそれぞれ必要な組合わせ分付加したアプリケーションプログラムを準備する必要がある。例えばこの作業は「IBM AIX 5L V5.2 コマンド・リファレンス 第2巻 (dからh)」邦文資料番号SC88-6970-03および英文資料番号SC23-4116-05のgprof Commandに示される様に、情報処理装置で実行可能なアプリケーションプログラムを生成する際にコンパイラに対して性能プロファイリングを行う旨（例えばCコンパイラccでの-pgオプション）を明示的に指定することで実施する事が出来る。あるいは特開2000-47902号公報に示されるように、ソースプログラムのコンパイル時のオブジェクトファイルに関数のテキスト命令郡の開始部分毎にあらかじめ実行時の性能に影響が小さいNOP(No Operation)命令からなる冗長命令を展開し、そのオブジェクトファイルをリンケージしてロードプログラムを作成する時点でプロファイリング対象の関数の冗長命令を実行履歴採取関数に分岐するように変更することで実施する事が出来る。
【００１０】
しかし、例えば顧客が既に使用している本番稼動アプリケーションプログラムに対して性能プロファイリングを実施したい場合、前述の201、203および210を改めて付加する作業を実施するためのアプリケーションプログラムの修正、再コンパイル及び再起動が必要となり、顧客側がアプリケーションプログラムの修正、入れ替えあるいは再立ち上げを望まない場合、または顧客側でアプリケーションプログラムのプログラムソースコードを保持していない等の理由で修正が不可能な状況下では、性能プロファイリングが実施できず、アプリケーションプログラムの性能測定および最適化のための情報を取得することが不可能という問題があった。
【００１１】
上述の通り性能プロファイリングを実施するためには、性能プロファイリングを実施したいアプリケーションプログラム内の関数あるいはルーチンに対して、予め201、203および210に相当する部分を追加する必要がある。これは性能プロファイリングを実施したいアプリケーションプログラムに対して当該部分を追加していない場合で、かつ何らかの理由によりアプリケーションプログラムの修正、再コンパイルあるいは再起動が実施できない場合は、性能プロファイリングが不可能であることを意味する。
本発明は、既存のアプリケーションプログラムに対して性能プロファイリングを目的としたアプリケーションプログラムの修正、再コンパイルおよび再起動を行うこと無く、性能プロファイリングを実施するための方法を提供することを目的とする。
【課題を解決するための手段】
【００１２】
前述の目的を実現するために、本発明では、情報処理装置内の命令プロセッサに組み込まれている、ハードウェアモニタと呼ばれるCPU性能プロファイリングのための論理、およびその論理で提供されるある一定の閾値を超える回数の測定イベントが発生した際に割込みを発生する機能と、アプリケーションプログラムの性能プロファイリングを実施するための割込み処理ハンドラを用いる事で、上述の課題を解決するものである。
【発明の効果】
【００１３】
従来の性能プロファイリングでは対象となる関数およびルーチンの実行時間のみが取得可能な情報であったのに対して、本発明の性能プロファイリング方法では、ハードウェアモニタと呼ばれるCPU性能プロファイリング論理およびその機能を用いているため、対象となる関数およびルーチンの実行時間だけでなく、実行命令数あるいはキャッシュミス回数あるいは分岐予測成功回数等のアプリケーションプログラム最適化のためのより詳細な情報を取得可能な点にある。
【発明を実施するための最良の形態】
【００１４】
本発明の性能プロファイリング方法は、ハードウェアモニタと呼ばれるCPU性能プロファイリング論理およびその割込み発生機能、そして性能プロファイリングを実施するための対応する割込み処理ハンドラを用いて、性能プロファイリングを実施したい関数あるいはルーチンに対して性能プロファイリング開始・終了呼び出しおよび性能プロファイリング関数本体を追加するという手間を削減することで、既存のアプリケーションプログラムに対して修正、再コンパイルまたは再起動を行うこと無しに、当該アプリケーションプログラムの性能プロファイリングを実現した。
【実施例１】
【００１５】
図1に発明の実施形態の例を示す。
100は情報処理装置上でアプリケーションプログラムが配置されるプログラムメモリ領域を示している。100上にはアプリケーションプログラムを構成する関数の一つである関数func_a(101)およびfunc_b(102)がそれぞれ配置されている。またアプリケーションプログラムとは独立した性能プロファイリング用割込みハンドラ120が100上に別途配置されている。さらに、ハードウェアモニタ(110)と呼ばれる性能プロファイリング専用の論理ユニットが情報処理装置内のCPUに内蔵されている。
【００１６】
110は、例えば特開平8-30494号公報に示される様な、CPUのオペレーションを邪魔すること無くCPUの状態をサンプリングする性能プロファイリング機能を提供するもので、110に対して指定したCPU内部でのイベント（例えば1命令実行完了、キャッシュメモリのミス発生等）を検出する機能(130)と、当該イベントの発生回数をカウントするイベント発生回数カウンタ(111)と、110に対して指定された閾値を保持しておくレジスタ(112)と、111と112の値を比較する比較器(113)と、比較器による111と112の値の比較結果より閾値を超える回数分のイベントが発生した場合に割込み(140)を上げる機能とを有する。ここで、140の割込みが発生した場合には120が呼び出されるように、予め割込み飛び先アドレスが指定されているものとする。
【００１７】
図2に、110による割込み(140)発生時に120で実行される処理内容を示す。
120内では先ず割込み元アドレスを取得する(151)。これは一般のオペレーティングシステムが、割込み処理完了時に元の実行中のアドレスに処理を復旧するために保持しておくアドレスのことである。
【００１８】
次に、当該アドレスより割込み元がどの関数・あるいはルーチンに対応するかを一覧表より求める(152)。この一覧表は例えば図3に示される様に、各々の関数名あるいはルーチン名とその始点アドレスおよび終点アドレスが記述されているもの(160)であり、アプリケーションプログラムが実行される以前にオペレーティングシステム等によって取得される。120内では当該アドレスをそれぞれの関数あるいはルーチンの始点アドレスおよび終点アドレスと比較し、当該アドレスが始点〜終点の間に含まれる関数名またはルーチン名を取得する。
【００１９】
次に、取得された関数名、ルーチン名に対応するカウント数を1つ増加させる(153)。このカウント数は例えば図4に示される様な、関数名と対応する関数の割込み発生回数（カウント数）を保持する一覧表(170)の形式で性能プロファイル情報(211)として格納される。
【００２０】
そして最後に110内のイベント発生回数カウンタ(111)を"0"にリセット(154)した後、元の割込み発生元アドレスへその実行を復旧する。
【００２１】
次に、本実施形態のでの性能プロファイリング例を示す。
図1において、例えばハードウェアモニタ(110)に対して検出するイベント130の対象として「命令実行消費サイクル数」を、そして140の割込みを起動するカウントの閾値112として「100回」を指定したとする。
【００２２】
情報処理装置が関数101へ処理を移行し実行して行くのと並行して、ハードウェアモニタ110は指定された命令実行消費サイクル数を101の実行と共にカウントして行く。このカウントは専用のハードウェアが命令の実行と並行して実施するため、このプロファイリング自体が情報処理装置のアプリケーションプログラム実行に対して何らかの影響を与える事は無く、カウントされた値は情報処理装置内でCPUがそのアプリケーションプログラムの実行に消費したサイクル数を正確に表している。
【００２３】
101の実行途中でカウント数が100を超えると、比較器113の比較結果より割込み140が発生し、情報処理装置は120へその制御を移行する。120内のルーチンでは、最初に割込み元のアドレスが求められる(151)が、この場合は101の実行途中のアドレスがこれに相当する。次に160の一覧表を元に当該アドレスから割込み発生時点で実行していた関数名を取得する(152)。この場合はfunc_a(101)がこれに相当する。次に一覧表170の当該関数名の割込み発生回数の部分を1つ増加させる(153)。そして最後に154にて111を"0"にリセットし(154)、割込み発生時に実行していた元の関数(101)へ制御を復旧する。
【００２４】
この一連の性能プロファイリング動作は情報処理装置がアプリケーションプログラムを実行している最中は継続して実施され、例えば上述の通り101の実行最中に複数回割込み(140)が発生した場合にはその回数に応じて対応する一覧表(170)のカウント数が増加され、また情報処理装置が関数func_b(102)を実行最中に割込みが発生した場合には、170中の対応するカウント数が割込み発生回数に応じて増加される。
【００２５】
ここで、今回の実施例では検出するイベントとして命令実行サイクル数を選択し、さらにその閾値として100回を指定したため、割込み発生回数×100サイクルが各関数の実行に消費された時間とほぼ一致する。ここで情報処理装置内で使用されているCPUの動作周波数は予め取得しておき、一覧表170内の項目として各関数の実行消費時間（例えばmsec）を併せて算出・保持しておく。
【００２６】
アプリケーションプログラムの実行が終了した後、一連の性能プロファイリング結果は一覧表170の中に保持されている。例えばシステム管理者は170の結果を元に各々の関数とその実行消費時間を図5に示すヒストグラムの形で表示する事で、どの関数でより多くの実行時間を消費しているかが解析可能である。例えばシステム管理者は当該ヒストグラムに示される関数で消費されるCPU時間を何らかの方法で最適化した後、再度本実施例での性能プロファイリングを適用し、次回どの関数あるいはルーチンに対して最適化が必要であるかの情報が取得する。この一連の作業を繰り返し適用し、効率よくアプリケーションプログラムの最適化を行う。
【００２７】
以上説明した様に、本実施例によれば、性能プロファイリングを実施したいアプリケーションプログラムに対して追加で性能プロファイリングのための関数呼び出し等の部分を追加する必要が無く、このため、既存のアプリケーションプログラムに対して性能プロファイリングを目的としたアプリケーションプログラムの修正、再コンパイルおよび再起動を行うこと無く、性能プロファイリングを実施するための方法を提供するが可能となる。
【００２８】
なお、従来技術による性能プロファイリングが対象となる関数の開始時点と終了時点のハードウェア時計の差分より当該関数の実行時間を算出しているのに対して、本実施例では110による命令実行消費サイクル数を直接カウントしている。従来技術の方法では、オペレーティングシステムの命令実行スケジューリングによりその測定性能に誤差が含まれるのに対して、本実施例では性能プロファイリング最中にその様な誤差が含まれる事が無く、より正確な命令実行消費時間を取得することが可能である。
【００２９】
また、本実施例では110で検出するイベントとして「命令実行消費サイクル」を指定しているが、当該イベント以外のイベント、例えばキャッシュミス発生回数、TLBミス発生回数等を指定する事で、命令実行消費時間以外の面からも性能プロファイリングが可能であることは自明である。
【００３０】
また、本実施例では110に備わっている、閾値との比較機能(113)及び割込み生成機能(140)を用いた性能プロファイリング例を示しているが、この割込み機能を情報処理装置に組み込まれているインターバルタイマによる一定時間毎の割込み機能に置き換える事で、割込み生成機能を有さない種類の110においても、同等の性能プロファイリングを実現できる事は自明である。
【産業上の利用可能性】
【００３１】
本実施例ではアプリケーションプログラムの性能プロファイリングを元に説明をしているが、測定対象プログラムの修正、再コンパイルあるいは再起動が不要なことから、アプリケーションプログラムに限らず例えばオペレーティングシステムあるいはファームウェア等の基本ソフトウェアの性能プロファイリングを実施することも可能であり、その方面への適用が考えられる。
【図面の簡単な説明】
【００３２】
【図１】本発明の1実施例の性能プロファイリング方法により、アプリケーションプログラムの性能プロファイリングを実施する方法の構成を示す図である。
【図２】図1の性能プロファイリング方法の性能プロファイル割込みハンドラ内で実行される処理の内容の1例を示す図である。
【図３】図2の性能プロファイル割込みハンドラ内で使用される、各関数毎の始点アドレスおよび終点アドレスを保持する一覧表の1例を示す図である。
【図４】図2の性能プロファイル割込みハンドラ内で使用される、各関数毎の割込み発生回数を保持する一覧表の1例を示す図である。
【図５】図1の性能プロファイリング方法によって得られた性能プロファイリング情報を解析するためのヒストグラムの1例を示す図である。
【図６】従来の1実施例の性能プロファイリング方法により、アプリケーションプログラムの性能プロファイリングを実施する方法の構成を示す図である。
【図７】図6の性能プロファイリング方法の性能プロファイル用ルーチン中でプロファイリング開始時に実行される処理の内容の1例を示す図である。
【図８】図6の性能プロファイリング方法の性能プロファイル用ルーチン中でプロファイリング終了時に実行される処理の内容の1例を示す図である。
【図９】図7,8の性能プロファイル用ルーチン内で使用される、各関数毎の消費時間を保持する一覧表の1例を示す図である。
【符号の説明】
【００３３】
100:プログラムメモリ領域
101:性能プロファイリング対象関数func_a
102:性能プロファイリング対象関数func_b
110:ハードウェアモニタ
111:イベント発生回数カウンタ
112:閾値保持レジスタ
113:比較器
120:性能プロファイル用割込みハンドラ
121:性能プロファイル情報保存領域
130:測定対象イベント検出信号
140:割込み信号
151:性能プロファイル用割込みハンドラ中での処理
152:性能プロファイル用割込みハンドラ中での処理
153:性能プロファイル用割込みハンドラ中での処理
154:性能プロファイル用割込みハンドラ中での処理
160:関数名・ルーチン名始点終点アドレス一覧表
170:性能プロファイリング結果一覧表
200:プログラムメモリ領域
201:性能プロファイリング開始呼び出し
202:性能プロファイリング対象関数func_a
203:性能プロファイリング終了呼び出し
204:性能プロファイリング開始呼び出し
205:性能プロファイリング対象関数func_b
206:性能プロファイリング終了呼び出し
210:性能プロファイリング関数prof
211:性能プロファイル情報保存領域
220:性能プロファイリング開始
221:性能プロファイリング終了
251:性能プロファイル用ルーチン中での処理
252:性能プロファイル用ルーチン中での処理
261:性能プロファイル用ルーチン中での処理
262:性能プロファイル用ルーチン中での処理
263:性能プロファイル用ルーチン中での処理
264:性能プロファイル用ルーチン中での処理
270:性能プロファイリング結果一覧表
【図１】
2005215816.tif 000003
【図２】
2005215816.tif 000004
【図３】
2005215816.tif 000005
【図４】
2005215816.tif 000006
【図５】
2005215816.tif 000007
【図６】
2005215816.tif 000008
【図７】
2005215816.tif 000009
【図８】
2005215816.tif 000010
【図９】
2005215816.tif 000011