(57)【要約】【課題】ソースプログラムを必要とせずに，実行形式または中間コードのプログラムの実行時間を測定する方法を提供する。【解決手段】ソースプログラム２１を実行形式または中間コードに変換した第１実行プログラム２３の実行時間を測定する場合に，プログラム解析部３１の解析結果をもとに監視コード追加部３２が，実行時間測定個所指示コード，実行開始時刻取得コード，実行終了時刻取得コードなどの実行時間測定のための監視コードを，第１実行プログラム２３に追加して，第２実行プログラム１１を生成する。プログラム実行マシン１が，第２実行プログラム１１を実行するときに，監視コードから実行プログラム監視部１２を呼び出し，実行時間測定個所の実行時間開始時刻，実行終了時刻を収集して，実行ログ１４として出力する。【選択図】    図１
2004258728.tif 000002
【特許請求の範囲】
【請求項１】
実行形式もしくは中間コードで与えられたプログラムの実行時間を測定する方法であって，
前記プログラムにおける実行時間測定開始個所から実行時間測定終了個所までの実行時間測定範囲においてプログラム実行の例外割込みなどの何らかの事象が発生しても，その範囲の実行直後に必ず実行される命令の範囲を特定可能な実行時間測定個所指示命令を，前記プログラムの実行時間測定範囲部分に追加し，
前記実行時間測定範囲の直前に実行開始時刻を取得する実行開始時刻取得命令を追加し，
前記実行時間測定範囲の実行直後に必ず実行される命令の範囲に，実行終了時刻を取得する実行終了時刻取得命令を追加することにより，
前記プログラムに，少なくとも前記実行時間測定個所指示命令，前記実行開始時刻取得命令，前記実行終了時刻取得命令を含む監視コードが追加された第２のプログラムを生成する第１のステップと，
前記第２のプログラムを実行することにより，前記実行開始時刻取得命令の実行によって取得された実行開始時刻と，前記実行終了時刻取得命令の実行によって取得された実行終了時刻とを収集し記録する第２のステップとを有する
ことを特徴とするプログラム実行時間測定方法。
【請求項２】
請求項１記載のプログラム実行時間測定方法において，
前記実行時間を測定するプログラムが，Ｊａｖａ言語で記述されたプログラムを翻訳したプログラムであり，
前記実行時間測定個所指示命
令が前記実行時間測定範囲をｔｒｙ節として設定するＪａｖａバイトコードであり，
前記実行開始時刻取得命令が実行開始時刻を取得するＪａｖａバイトコードであり，
前記実行終了時刻取得命令が前記ｔｒｙ節に対応するｆｉｎａｌｌｙ節として実行終了時刻を取得するＪａｖａバイトコードである
ことを特徴とするプログラム実行時間測定方法。
【請求項３】
請求項１記載のプログラム実行時間測定方法において，
前記第１のステップでは，
前記実行時間測定個所指示命令，前記実行開始時刻取得命令および実行終了時刻取得命令の追加時に前記各命令の二重追加を防ぐための所定の変数名とその値またはフラグを同時に追加し，
前記実行時間測定個所指示命令，前記実行開始時刻取得命令および実行終了時刻取得命令の追加の際に，前記所定の変数名とその値またはフラグが存在するか否かを判定し，存在する場合には前記各命令の追加を中止することで前記各命令の二重追加を防ぐ
ことを特徴とするプログラム実行時間測定方法。
【請求項４】
請求項１記載のプログラム実行時間測定方法において，
前記第２のステップでは，
前記実行開始時刻取得命令によって前記実行時間測定範囲に対し一意に割り振られる識別子と実行開始時刻とを取得後，所定の記録個所に前記取得した識別子と実行開始時刻とを記録し，
前記実行終了時刻取得命令によって実行終了時刻を取得した際に，前記所定の記録個所に前記識別子に関係付けて前記取得した実行終了時刻を記録する
ことを特徴とするプログラム実行時間測定方法。
【請求項５】
請求項１記載のプログラム実行時間測定方法において，
前記第１のステップでは，
前記実行時間を測定するプログラムに対する少なくとも前記実行時間測定個所指示命令，前記実行開始時刻取得命令，前記実行終了時刻取得命令を含む監視コードの追加を，ファイル化されたプログラムの実行形式または中間コードを対象に行う
ことを特徴とするプログラム実行時間測定方法。
【請求項６】
請求項１記載のプログラム実行時間測定方法において，
前記第１のステップでは，
前記実行時間を測定するプログラムに対する少なくとも前記実行時間測定個所指示命令，前記実行開始時刻取得命令，前記実行終了時刻取得命令を含む監視コードの追加を，メモリ上にロードされたプログラムの実行形式または中間コードを対象に行う
ことを特徴とするプログラム実行時間測定方法。
【請求項７】
請求項２に記載のプログラム実行時間測定方法において，
前記実行時間測定範囲をメソッドの実行開始部分から実行終了部分とする
ことを特徴とするプログラム実行時間測定方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はプログラムの実行時間の測定方法に関し，特に，プログラムの実行時間を測定するために実際のソースプログラムを使用することなく，実行形式・中間コードにおいて実行時間測定に関する命令を追加し，プログラムの実行時間を測定する方法に関するものである。
【０００２】
【従来の技術】
従来，プログラムの実行時間を測定する技術として，例えば，下記の特許文献１（分散アプリケーション試験・運用管理システム）に記載された技術がある。この技術では，プログラムのソースファイルの実行時間を測定する個所（以下，実行時間測定個所という）において実行開始時刻を取得するソースコードと実行終了時刻を取得するソースコードを追加することで，プログラムの実行時間を測定することを実現している。
【０００３】
【特許文献１】
特開２００２−８２９２６号公報
【０００４】
【発明が解決しようとする課題】
しかし，上記特許文献１に示される技術を用いてプログラムの実行時間を測定する場合，前記実行時間測定個所における実行開始時刻を取得するソースコードおよび実行終了時刻を取得するソースコードの追加のためにソースプログラムを改変することが必要であった。したがって，実行時間測定対象のプログラムが，ソースプログラムをコンパイルした実行形式プログラムもしくは中間コードで表されるものであって，ソースプログラム自体を持っていない場合には，プログラムの任意の範囲の実行時間を測定することはできなかった。
【０００５】
本発明は，上記の点に鑑みてなされたもので，その目的はプログラムのソースプログラムを必要とせずにプログラムの実行時間を測定する方法を提供することにある。
【０００６】
【課題を解決するための手段】
上記課題を解決するため，本発明は，ソースプログラム上でプログラマが任意に指定した範囲（以下，ｔｒｙ部という）について，前記ソースプログラムの実行形式もしくは中間コードのｔｒｙ部の実行時に例外割込みなどが発生してもｔｒｙ部の実行の直後に必ず実行される範囲（以下，ｆｉｎａｌｌｙ部という）を指定することができる仕様を持つプログラミング言語および実行環境で記述，生成された実行形式または中間コードにおいて，実行時間を測定する実行時間測定個所をｔｒｙ部とする実行時間測定個所指示命令を追加し，ｔｒｙ部の直前に実行開始時刻を取得する実行開始時刻取得命令を追加し，前記ｔｒｙ部に対応するｆｉｎａｌｌｙ部として実行終了時刻を測定する実行終了時刻取得命令を追加し，前記実行形式または中間コードの実行時にｔｒｙ部およびｆｉｎａｌｌｙ部の実行により前記実行開始時刻取得命令が取得した実行開始時刻と前記実行終了時刻取得命令が取得した実行終了時刻との差分を前記実行時間測定個所の実行時間として算出することを最も主要な特徴とする。
【０００７】
【発明の実施の形態】
以下，本発明の実施の形態として，プログラミング言語がＪａｖａ（登録商標）である場合のプログラムの実行時間測定方法の例を説明する。
【０００８】
図１は，本発明の適用対象システム構成の一例を示す図である。本システムは，第２実行プログラム１１を実行し，その実行時間を測定するコンピュータであるプログラム実行マシン１と，プログラムを開発し，ソースプログラム２１を実行形式または中間コードの第１実行プログラム２３に変換するコンピュータである開発機２と，第１実行プログラム２３に実行時間測定のための監視コードを追加し第２実行プログラム１１を生成するコンピュータであるプログラム操作機３と，それらを接続するネットワーク４とからなる。
【０００９】
プログラム実行マシン１は，一つまたは複数の監視コード追加済みである第２実行プログラム１１の実行を監視するためのプログラムである実行プログラム監視部１２と，ＪａｖａＶＭ１３と，実行ログ１４を記録する手段とを備える。ＪａｖａＶＭ１３は，Ｊａｖａで記述されたプログラムが動作する環境を提供する仮想的なコンピュータ（プログラム）である。
【００１０】
開発機２は，プログラミング言語Ｊａｖａで記述されたソースプログラム２１を第１実行プログラム２３に変換（以下，実行形式変換処理という）する開発環境２２を備える。第１実行プログラム２３は，開発環境２２によってソースプログラム２１が翻訳されて生成されたプログラムであって，後述する実行時間測定のための監視コードがまだ追加されていないプログラムである。
【００１１】
プログラム操作機３は，ソースプログラム２１を利用せずに第１実行プログラム２３のプログラム構造等を解析するプログラム解析部３１と，第１実行プログラム２３における実行時間測定個所に対し，ｔｒｙ節，ｆｉｎａｌｌｙ節を実行する実行時間測定個所指示コードであるＪａｖａバイトコードを追加し，ｔｒｙ節の直前に実行開始時刻を取得する実行開始時刻取得コードであるＪａｖａバイトコードを追加し，ｆｉｎａｌｌｙ節に実行終了時刻を取得する実行終了時刻取得コードであるＪａｖａバイトコードを追加する監視コード追加部３２とを備える。なお，実行時間測定個所指示コード，実行開始時刻取得コード，実行終了時刻取得コードをまとめて監視コードといい，これらのＪａｖａバイトコードの追加処理を監視コード追加処理という。
【００１２】
プログラム操作機３が，第１実行プログラム２３に前記監視コードを追加することで第２実行プログラム１１が生成される。なお，プログラム実行マシン１，開発機２，プログラム操作機３は，それぞれ異なるコンピュータである必要はなく，同じコンピュータであってもよい。
【００１３】
図２は，プログラム操作機３におけるプログラム解析部３１および監視コード追加部３２による監視コード追加処理のフローチャートの一例である。
【００１４】
プログラム解析部３１は，ステップＳ２１で前記監視コード未追加の第１実行プログラム２３を所定の媒体から読み込む。このとき，第１実行プログラム２３が，ｊａｒ，ｗａｒ，ｅａｒのようなデータ圧縮されたアーカイブ・ファイルであった場合には，アーカイブ・ファイルのデータを所定の媒体に展開し，展開された実行プログラムそれぞれについて，以下のフローに従って処理を行う。
【００１５】
次に，プログラム解析部３１は，ステップＳ２２でＪａｖａバイトコードを直接操作するＪａｖａライブラリを用いることなどにより，第１実行プログラム２３について，Ｊａｖａバイトコードレベルの構文等の解析を行う。Ｊａｖａバイトコードを直接操作するＪａｖａライブラリとして，例えばＢＣＥＬがある。ＢＣＥＬは，周知のＡｐａｃｈｅ  Ｓｏｆｔｗａｒｅ  Ｆｏｕｎｄａｔｉｏｎが管理しているｊａｖａライブラリであり，「ｈｔｔｐ：／／ｊａｋａｒｔａ．ａｐａｃｈｅ．ｏｒｇ／ｂｃｅ１／ｉｎｄｅｘ．ｈｔｍｌ  」のＵＲＬから情報を入手できる。本実施の形態ではＢＣＥＬを利用するものとするが，本発明の実施においては，必ずしもＢＣＥＬを利用しなければならないわけではなく，本発明は，ＢＣＥＬの利用に限定されない。またＪａｖａバイトコードを直接操作するＪａｖａライブラリを用いることに限定されない。
【００１６】
続いて監視コード追加部３２は，プログラム解析部３１が得た解析結果から，ステップＳ２３で所定の変数名および値が既に存在しているか否かを判断する。ここで，所定の変数名および値とは，監視コードの二重追加を防ぐためのものであり，例えば，後述する図４のＪａｖａソースプログラム第６行目の「Ｓｔｒｉｎｇ  ｔｒａｎｓｌａｔｏｒ＝”Ｔｒａｎｓｌａｔｅｄ”」がこれに該当する。これは，監視コードが既に追加されているかどうかを判別することができるものであればよいので，フラグ等でもよい。
【００１７】
ステップＳ２３の判定で，プログラム中に所定の変数名および値が既に存在していた場合には，既に実行時間測定のための監視コードが追加されているものと判断し，ステップＳ３０へ移行する。所定の変数名および値が存在していない場合には，第１実行プログラム２３に前記監視コードが未追加であると判断し，ステップＳ２４で，プログラム解析部３１により得られた解析結果から実行時間測定のための監視コードの追加位置を決定する。
【００１８】
次に監視コード追加部３２は，ステップＳ２５およびステップＳ２７で前記監視コード追加に伴い監視コード自体および第１実行プログラム２３の解析結果にＪａｖａバイトコードレベルでのジャンプ先番地変更等の必要があるか否かを判断し，監視コードの修正の必要があれば，ステップＳ２６で監視コードの修正を行い，第１実行プログラム２３の修正の必要があれば，ステップＳ２８で第１実行プログラム２３の修正を行う。ステップＳ２８における第１実行プログラム２３の修正は，例えば，後述する図４のＪａｖａソースプログラム第８行目および第１９行目のｔｒｙ節，ｆｉｎａｌｌｙ節の追加が該当する。
【００１９】
その後，監視コード追加部３２は，ステップＳ２９で実行時間測定のための監視コードを追加し，また，前記監視コードの二重追加を防ぐための所定の変数名および値を追加する。ステップＳ２９における監視コードの追加は，例えば，後述する図４のＪａｖａソースプログラム第７行目の「ｉｄ＝ｇｅｔＳｔａｒｔＴｉｍｅ（）；」および第２０行目の「ｇｅｔＥｎｄＴｉｍｅ（ｉｄ）；  」の追加が該当する。最後に，監視コード追加部３２は，ステップＳ３０で前記監視コードが追加されたメモリ上の実行プログラムを第２実行プログラム１１として所定の媒体上に書き出すことにより，第２実行プログラム１１を生成する。
【００２０】
図３および図４は，監視コード追加部３２が行う前記監視コード追加処理の理解のためにソースコードに対応させて説明する図である。図３は，第１実行プログラム２３の一例を，説明をわかりやすくためにソースプログラムのイメージで示しているが，実際には，第１実行プログラム２３は，図３に示すソースプログラムを翻訳した中間コードからなる。図４も同様である。
【００２１】
本発明の実施の形態では，ＨｅｌｌｏＷｏｒｌｄクラスのｍａｉｎメソッドの実行開始から実行終了までの時間を実行時間として測定するものとする。このとき，図３に示す点線で囲んだ部分が実行時間測定個所である。以下に，図３に示すＪａｖａプログラムの概要を説明する。
【００２２】
図３のＪａｖａプログラムＨｅｌｌｏＷｏｒｌｄ．ｊａｖａ  ３０１では，まず，第１行目の「Ｐａｃｋａｇｅ  ｔｅｓｔ；  」によって，クラス「Ｈｅｌｌｏ  Ｗｏｒｌｄ  」が「ｔｅｓｔ」というパッケージに属することを宣言した後，第３行目でクラス「Ｈｅｌｌｏ  Ｗｏｒｌｄ  」を宣言している。また，第４行目の「ｐｕｂｌｉｃ  ｓｔａｔｉｃ  ｖｏｉｄ  ｍａｉｎ（Ｓｔｒｉｎｇ［］ａｒｇｖ）  ｛」で，引数が文字列配列であり，戻り値がｖｏｉｄであるクラスメソッドｍａｉｎを宣言している。
【００２３】
次に，第５行目の「ｔｒｙ  ｛」で，例外処理を受け付ける範囲を指定している。このｔｒｙ節の記述個所が，実行時間測定開始個所３１１となっている。そして，第６行目および第７行目の「ｉｆ（ａｒｇｖ［０］．ｃｏｍｐａｒｅＴｏ  （”０”））  ｛」および「ｒｅｔｕｒｎ；  」は，１つ目のコマンドライン引数が，文字”０”  ならばｍａｉｎを終了することを示し，「ｒｅｔｒｕｎ；  」の記述個所が第１終了個所３２１となっている。第９行目の「Ｓｙｓｔｅｍ．ｏｕｔ．ｐｒｉｎｔｌｎ（”Ｈｅｌｌｏ  Ｗｏｒｌｄ”）；」で文字列「Ｈｅｌｌｏ  Ｗｏｒｌｄ」が表示される。
【００２４】
また，第１０行目の「｝ｃａｔｃｈ（ｅｘｃｅｐｔｉｏｎ  ｅ）｛」は，対応するｔｒｙ節で指定した範囲内で例外が発生した場合に，その例外をｅとして，ここで示す範囲が呼び出されることを示している。第１１行目の「ｅ．ｐｒｉｎｔＳｔａｃｋ  Ｔｒａｃｅ（）；  」は，例外ｅの保持するスタック情報を表示する。第１２行目および第１４行目の「ｒｅｔｕｒｎ；  」はｍａｉｎを終了することを意味する。この第１２行目が第２終了個所３２２となり，第１４行目が第３終了個所３２３，実行時間測定終了個所３１２となる。
【００２５】
上記のように，図３のプログラムにおいて終了個所は３個所あり，第１終了個所３２１，第２終了個所３２２，第３終了個所３２３が，それぞれ第１実行プログラム２３が正常，準正常，および例外発生によって実行時間測定個所の実行終了となる部分である。
【００２６】
図４は，本発明の実施の形態における監視コード追加例を示す図であって，第２実行プログラム１１の一例をソースプログラムのイメージで示したものである。図４において，点線で囲んだ部分が実行時間測定個所である。
【００２７】
本発明の実施の形態では，図４のＪａｖａプログラムＨｅｌｌｏＷｏｒｌｄ．ｊａｖａ  ４０１の第９行目の実行時間測定開始個所３１１から実行時間測定終了個所３１２をｔｒｙ節でくくり，実行時間測定個所指示コードとして第８行目および第１９行目にｔｒｙ節，ｆｉｎａｌｌｙ節を追加する。
【００２８】
また，第８行目のｔｒｙ節の直前の第７行目に，実行開始時刻取得コード４１１である「ｉｄ＝ｇｅｔＳｔａｒｔＴｉｍｅ（）；」を追加する。また，ｔｒｙ節に対応するｆｉｎａｌｌｙ節に実行終了時刻取得コード４１２である「ｇｅｔＥｎｄＴｉｍｅ（ｉｄ）；  」（第２０行目）を追加する。この操作により，実行時間測定開始個所３１１から実行時間測定終了個所３１２までの実行時間測定個所を終了する場合には，必ずｆｉｎａｌｌｙ節の実行終了時刻取得コード４１２が実行されることになり，前記３個所の終了個所の特定が不要となる。
【００２９】
監視コード追加部３２において，図４に示すような監視コードを追加する場合，Ｊａｖａバイトコードを直接操作するＪａｖａライブラリを用いるなどして，上記内容に沿って，ｔｒｙ節，ｆｉｎａｌｌｙ節や実行開始時刻取得コード４１１および実行終了時刻取得コード４１２のＪａｖａバイトコードを生成し，必要に応じて，プログラム解析部３１によって解析された第１実行プログラム２３のＪａｖａバイトコード内のジャンプ先番地変更等の修正を行い，前記ｔｒｙ節，ｆｉｎａｌｌｙ節や実行開始時刻取得コード４１１および実行終了時刻取得コード４１２のＪａｖａバイトコードを追加する。
【００３０】
また，図４のＪａｖａプログラム中，第６行目の「Ｓｔｒｉｎｇ  ｔｒａｎｓｌａｔｏｒ＝”Ｔｒａｎｓｌａｔｅｄ”；  」は，二重追加防止チェックに用いられる。すなわち，本発明において，二重追加防止チェック時に，例えば図４の第６行目の「ｔｒａｎｓｌａｔｏｒ」のような所定の変数名が宣言されていて，かつその値が所定の値（ここでは「Ｔｒａｎｓｌａｔｅｄ」）  である場合には，以後の追加処理を行わず，現在のバイトコードをそのまま第２実行プログラム１１として出力する。なお，実際にはバイトコードを第６行目のように変更するのではなく，上記ステップＳ２２における第１実行プログラム２３の解析結果の変数名宣言部分および値宣言部分を操作することによって，変数名およびその値の宣言を行う。
【００３１】
図３および図４の例では，ｍａｉｎメソッドの実行開始から実行終了までの時間を実行時間として測定するものとしているが，プログラム中における任意の個所を実行時間測定個所として，ユーザにインタラクティブに指定させるような実施も可能である。この場合，実行時間測定範囲をユーザに指定させるために，第１実行プログラム２３を視覚化して表示する必要があるが，例えばＪａｖａバイトコードを表示する既存のソフトウェア・ツールを用いて，第１実行プログラム２３の内容を表示し，その表示をもとに実行時間測定範囲をポインティングデバイス等によってユーザに指定させることができる。
【００３２】
また，ユーザにメニュー等により選択させることにより，実行時間測定個所をすべてのメソッドの各実行開始部分から実行終了部分とすることもできる。
【００３３】
図５は，ｇｅｔＳｔａｒｔＴｉｍｅ関数およびｇｅｔＥｎｄＴｉｍｅ関数の処理フローチャートである。ｇｅｔＳｔａｒｔＴｉｍｅ関数は，実行開始時刻取得コード４１１によって呼び出される関数であり，ｇｅｔＥｎｄＴｉｍｅ関数は，実行終了時刻取得コード４１２によって呼び出される関数である。
【００３４】
図５（Ａ）に示すように，ｇｅｔＳｔａｒｔＴｉｍｅ関数は，「ｉｄ＝ｇｅｔＳｔａｒｔＴｉｍｅ（）；」のように使用され，引数は無く，実行時間測定個所に対して一意に割り振られたｉｄ（識別子）を戻り値とする。
【００３５】
ｇｅｔＳｔａｒｔＴｉｍｅ関数では，以下のような処理が行われる。まず，実行プログラム監視部１２にｉｄを要求し（ステップＳ３１），実行プログラム監視部１２から，実行時間測定個所に対して一意に割り振られたｉｄを受け取る（ステップＳ３２）。次に，システムが提供する時刻取得関数によって現在の時刻である実行開始時刻を取得し（ステップＳ３３），ｉｄ，実行開始時刻の組を実行プログラム監視部１２に送信する（ステップＳ３４）。その後，実行プログラム監視部１２から取得したｉｄを戻り値として（ステップＳ３５），処理を終了する。
【００３６】
ｇｅｔＥｎｄＴｉｍｅ関数は，図５（Ｂ）に示すように，「ｇｅｔＥｎｄＴｉｍｅ（ｉｄ）；  」のように使用され，実行時間測定個所に対して一意に割り振られたｉｄ，すなわちｇｅｔＳｔａｒｔＴｉｍｅ関数の戻り値として取得したｉｄを引数とする。戻り値は無い。ｇｅｔＥｎｄＴｉｍｅ関数では，システムが提供する時刻取得関数によって現在の時刻である実行終了時刻を取得し（ステップＳ４１），引数で指定されたｉｄと，実行終了時刻との組を実行プログラム監視部１２に送信し（ステップＳ４２），処理を終了する。
【００３７】
次に，実行プログラム監視部１２の処理の概要について説明する。
【００３８】
（１）自身の初期化
実行プログラム監視部１２がＪａｖａＶＭ１３内にロードされるときに，一度だけ初期化される。このとき，
・ｉｄ払い出し用クラスの初期化，
・ｉｄ，実行開始時刻および実行終了時刻の記憶領域の初期化，
・ｉｄ，実行開始時刻および実行終了時刻のログ化ルーチンの設定（定期的にログ化を行うようにする），
を行う。
【００３９】
（２）ｉｄの払い出し
ｉｄの払い出しは，ｇｅｔＳｔａｒｔＴｉｍｅ関数における図５（Ａ）のステップＳ３１の要求に対して行う処理であり，上記ステップＳ３１では，実行プログラム監視部１２のｉｄ払い出し用クラスのメソッドｇｅｔを使ってｉｄを獲得する。メソッドｇｅｔは，内部で払い出すｉｄを１増加してからそのｉｄを返す。また，メソッドｇｅｔは，複数の同時払い出し要求（ｇｅｔＳｔａｒｔＴｉｍｅ関数の呼び出し）に対し，同じｉｄを払い出すことのないように排他的に実行されるようになっている（Ｊａｖａ言語では，Ｓｙｎｃｈｒｏｎｉｚｅｄ  ｌｏｎｇ  ｇｅｔ（）  として実装されている）。
【００４０】
（３）ｇｅｔＳｔａｒｔＴｉｍｅ関数，ｇｅｔＥｎｄＴｉｍｅ関数の記録要求（ｉｄと時刻が送信される）の処理
・ｉｄ，実行開始時刻および実行終了時刻の記憶領域は，ｉｄをキーとして，（ｉｄ，実行開始時刻，実行終了時刻）の組を含むようになっている。
・ｇｅｔＳｔａｒｔＴｉｍｅ関数がｉｄと時刻を送信してきた場合，キーとしてｉｄが既に記憶領域上に存在しているかどうかをチェックする。存在しない場合には，（ｉｄ，実行開始時刻，ＮＵＬＬ）という組を記憶領域上に生成する。キーとしてｉｄが既に存在している場合にはエラーとし，前記生成処理をスキップする。
・ｇｅｔＥｎｄＴｉｍｅ関数がｉｄと時刻を送信してきた場合，キーとしてｉｄが記憶領域上に存在しているかどうかをチェックする。存在する場合には，対応する組の実行終了時刻を上書きする。キーとしてｉｄが存在しない場合には，（ｉｄ，ＮＵＬＬ，実行終了時刻）という組を記憶領域上に生成する。
【００４１】
（４）ｉｄ，実行開始時刻および実行終了時刻のログ化
・所定の時間間隔でログ化を行う。
・ログ化時には，ｉｄ，実行開始時刻および実行終了時刻の記憶領域中の（ｉｄ，実行開始時刻，実行終了時刻）のＮＵＬＬでない３情報がそろった組について，その情報を外部記憶媒体等にログとして書き込み，かつ記憶領域からログ化し終えた組を消去する。なお，このログ化の際に，実行開始時刻および実行終了時刻から実行時間を計算して，（ｉｄ，実行開始時刻，実行終了時刻，実行時間）の組をログとして出力してもよい。このログ情報を参照することにより，目的とする第１実行プログラム２３の実行時間を知ることができる。
【００４２】
図６は，本発明を適用したシステムの一実施例を示す図である。ここで開発機２は，図１のプログラム操作機３を含む。ソースプログラム２１は，フェーズＰ１０で開発環境２２によって監視コード未追加の第１実行プログラム２３に変換される。この第１実行プログラム２３は，例えばＪａｖａ２  ＳＤＫ  Ｅｎｔｅｒｐｒｉｓｅ  Ｅｄｉｔｉｏｎ（Ｊ２ＥＥ）のＥＪＢ  コンポーネントまたはサーブレットである。第１実行プログラム２３に対して，フェーズＰ１１で監視コード追加処理が行われ，ファイル形式で第２実行プログラム１１として書き出される。この第２実行プログラム１１が，フェーズＰ１２でプログラム実行マシン１にコピーまたはファイル共有などの手段で提供された後，フェーズＰ１３でＪａｖａアプリケーションとして実行される。このフェーズＰ１３では，実行プログラム監視部１２が同一ＪａｖａＶＭ１３内で実行されるようになっている。
【００４３】
第２実行プログラム１１の実行時，第２実行プログラム１１内の実行開始時刻取得コード４１１により，その実行時に実行プログラム監視部１２が払い出す一意のｉｄと，現在の時刻である実行開始時刻とを，実行プログラム監視部１２に通知して所定の記録個所に格納し，また，実行終了時刻取得コード４１２により，前記ｉｄと，現在の時刻である実行終了時刻とを，実行プログラム監視部１２に通知し，対応するｉｄの記録個所に実行終了時刻を格納する。
【００４４】
実行プログラム監視部１２は，前記ｉｄと前記実行開始時刻および前記実行終了時刻から実行時間を計算して，ｉｄ，実行開始時刻，実行終了時刻，実行時間を実行ログ１４に出力する（フェーズＰ１４）。なお，本発明では実行時間測定対象となる実行プログラムについて，アーカイブ（ｊａｒ，ｗａｒ，ｅａｒなど）化されているか否かは問わない。アーカイブ化されている場合には，事前に復元を行えばよい。
【００４５】
図７は，本発明を適用したシステムの別の一実施例を示す図である。ここでプログラム実行マシン１は，図１のプログラム操作機３を含む。図６と同様にして実行形式変換処理のフェーズＰ２０で，ソースプログラム２１から第１実行プログラム２３が生成される。フェーズＰ２１では，第１実行プログラム２３がプログラム実行マシン１にコピーされ，フェーズＰ２２で，第１実行プログラム２３がプログラム実行マシン１のメモリにロードされる。なお，本発明では第１実行プログラム２３がアーカイブ（ｊａｒ，ｗａｒ，ｅａｒなど）化されているか否かは問わない。
【００４６】
フェーズＰ２２で，ＪａｖａＶＭ１３が第１実行プログラム２３をメモリへロードした後に，フェーズＰ２３で，プログラム解析部３１，監視コード追加部３２による監視コード追加処理が行われる。このフェーズＰ２３では，プログラム解析部３１が第１実行プログラム２３をＪａｖａＶＭ１３内のメモリ上から読み出し，また監視コード追加部３２が第２実行プログラム１１をＪａｖａＶＭ１３内のメモリ上に生成するようになっている。その後に，フェーズＰ２４に移行する。フェーズＰ２４では，監視コードが追加された第２実行プログラム１１が実行され，同時に実行プログラム監視部１２が同一ＪａｖａＶＭ１３内で実行される。
【００４７】
図７に示す実施例では，プログラム解析部３１が第１実行プログラム２３を読み出す媒体および監視コード追加部３２が第２実行プログラム１１を書き出す媒体は，外部記憶媒体のファイルではなく，メモリ領域となる。メモリ上に生成された前記監視コードが追加された第２実行プログラム１１の実行によって，図６の場合と同様にして，実行プログラム監視部１２が，（ｉｄ，実行開始時刻，実行終了時刻，実行時間）の組を実行ログ１４として生成し出力する（フェーズＰ２５）。
【００４８】
【発明の効果】
以上説明したように，本発明によれば，例えばＪａｖａバイトコードにおいて，実行時間測定個所に対しｔｒｙ節，ｆｉｎａｌｌｙ節を実行する実行時間測定個所指示コードを追加し，ｔｒｙ節の直前部分に実行開始時刻を測定する実行開始時刻取得コードを追加し，ｆｉｎａｌｌｙ節に実行終了時刻を測定する実行終了時刻取得コードを追加し，前記Ｊａｖａバイトコードの実行時にｔｒｙ節，ｆｉｎａｌｌｙ節の評価により，実行開始時刻取得コードが測定する実行開始時刻と，実行終了時刻取得コードが測定する実行終了時刻とを収集し，その差分を，実行時間測定個所の実行時間として算出することができるようになる。これによって，実行時間を測定するプログラムのソースプログラムを必要とすることなく，実行形式または中間コードの状態で，目的とするプログラムの実行時間を測定することが可能になる。
【図面の簡単な説明】
【図１】本発明の適用対象システム構成の一例を示す図である。
【図２】監視コード追加処理フローの一例を示す図である。
【図３】第１実行プログラムの一例をソースプログラムイメージで示した図である。
【図４】第２実行プログラムの一例をソースプログラムイメージで示した図である。
【図５】ｇｅｔＳｔａｒｔＴｉｍｅ関数およびｇｅｔＥｎｄＴｉｍｅ関数の処理フローチャートである。
【図６】本発明の適用システムの一実施例を示す図である。
【図７】本発明の適用システムの別の一実施例を示す図である。
【符号の説明】
１  プログラム実行マシン
２  開発機
３  プログラム操作機
４  ネットワーク
１１  第２実行プログラム
１２  実行プログラム監視部
１３  ＪａｖａＶＭ
１４  実行ログ
２１  ソースプログラム
２２  開発環境
２３  第１実行プログラム
３１  プログラム解析部
３２  監視コード追加部
【図１】
2004258728.tif 000003
【図２】
2004258728.tif 000004
【図３】
2004258728.tif 000005
【図４】
2004258728.tif 000006
【図５】
2004258728.tif 000007
【図６】
2004258728.tif 000008
【図７】
2004258728.tif 000009