(57)【特許請求の範囲】
【請求項１】
リクエストに応じて実行されるアプリケーションコードの実行履歴から、前記リクエスト毎の、前記アプリケーションコードに含まれるメソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、
前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成し、
前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークし、
前記重要呼び出しとしてマークされた各ノードのメソッドに識別情報としてのモデル番号を定義し、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、
前記モデル番号を更新するプログラムコードである処理種別判別コードを前記モデル番号遷移表に基づいて生成し、
前記アプリケーションコード中のメソッドのプログラムコードに該メソッドのモデル番号を更新する前記処理種別判別コードを挿入する、
ことを特徴とするコード変換方法。
【請求項２】
現在のメソッド呼び出し回数を判別するコードを前記アプリケーションコードに挿入する、
ことを特徴とする請求項１記載のコード変換方法。
【請求項３】
リクエストに応じて実行されるアプリケーションコードの実行履歴を前記リクエスト毎に取得し、
前記実行履歴から、前記リクエスト毎の、前記アプリケーションコードに含まれるメソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、
前記リクエスト毎にメソッド開始からそのメソッドを含むスレッドの完了するまでの時間を残時間として求め、
前記メソッド呼び出しシーケンスの出現回数をカウントし、前記残時間の平均時間を求め、
前記メソッド呼び出しシーケンスに基づいて処理種別分化木を作成し、
前記処理種別分化木において処理種別を確定するメソッド呼び出しを重要呼び出しとしてマークしたのち、メソッド呼び出しシーケンスを呼び出し元方向にトラバースし同じメソッドについても重要呼び出しとし、
前記処理種別分化木の重要呼び出しにより呼び出されるメソッドに識別情報としてのモデル番号を付し、前記平均時間をモデル表へ登録し、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、
前記モデル番号を更新するプログラムコードである処理種別判別コードを前記モデル番号遷移表に基づいて生成し、
前記アプリケーションコード中のメソッドのプログラムコードに該メソッドのモデル番号を更新する前記処理種別判別コードを挿入し、
前記アプリケーションコード中のメソッドのプログラムコードに該メソッドの呼び出し回数をカウントするコードを挿入し、
前記処理種別と、前記呼び出し回数とに基づいて前記モデル表の前記平均時間から各処理種別毎の残時間を求める、
ことを特徴とするリクエストの残り時間応答方法。
【請求項４】
前記アプリケーションコードに、前記メソッドの実行開始時刻と実行終了時刻を更新して記録するコードを自動生成して埋め込む、
ことを特徴とする請求項３記載のリクエストの残り時間応答方法。
【請求項５】
リクエストに応じて実行されるアプリケーションコードの実行履歴から、前記リクエスト毎の、前記アプリケーションコードに含まれるメソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得するメソッド呼び出しシーケンス取得手段と、
前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成する処理種別分化木作成手段と、
前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークする重要呼び出しマーク手段と、
前記重要呼び出しとしてマークされた各ノードのメソッドに識別情報としてのモデル番号を定義するモデル番号定義手段と、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成するモデル番号遷移表作成手段と、
前記モデル番号を更新するプログラムコードである処理種別判別コードを前記モデル番号遷移表に基づいて生成する処理種別判別コード生成手段と、
前記アプリケーションコード中のメソッドのプログラムコードに該メソッドのモデル番号を更新する前記処理種別判別コードを挿入する処理種別判別コード挿入手段と、
を具備することを特徴とするコード変換装置。
【請求項６】
コンピュータに、
リクエストに応じて実行されるアプリケーションコードの実行履歴から、前記リクエスト毎の、前記アプリケーションコードに含まれるメソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、
前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成し、
前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークし、
前記重要呼び出しとしてマークされた各ノードのメソッドに識別情報としてのモデル番号を定義し、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、
前記モデル番号を更新するプログラムコードである処理種別判別コードを前記モデル番号遷移表に基づいて生成し、
前記アプリケーションコード中のメソッドのプログラムコードに該メソッドのモデル番号を更新する前記処理種別判別コードを挿入する、
処理を実行させることを特徴とするコード変換プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コード変換方法、装置、プログラム、およびリクエストの残り時間応答方法に関する。
【背景技術】
【０００２】
ＷＷＷ（ワールド・ワイド・ウェブ）サービス（以下、「Ｗｅｂサービス」と呼ぶ）のシステムでは、リクエストの大幅な遅延がユーザのリクエスト中断を誘発し、ビジネスチャンスの損失を招く問題がある。
【０００３】
これに対応するために、残り処理時間を提示することによりユーザの行動を現在のリクエストに引きとどめておく技術が知られている。
現在処理中の処理種別を高速に正しく認識すれば、仕掛の処理の残り時間を正しく認識できる。
【０００４】
実行途中のリクエスト種別を判断する従来技術として、次のような技術が知られている。ネットワークを介して接続された複数のクライアント装置からの複数種類の要求を受信する受信装置と、この受信装置で受信された要求を順次記憶するステータスメモリと、要求の種類と要求の数との組合せのそれぞれについて予測処理時間が記憶された統計メモリと、受信装置で要求が受信された際に、ステータスメモリに現在記憶されている要求の種類及び要求の数に対応する予測処理時間を統計メモリから読み出して待ち時間を計算するプロセッサと、このプロセッサで計算された待ち時間をネットワークを介して要求を送信したクライアント装置に送信する送信装置とを備えている（例えば特許文献１）。
【０００５】
また、次のような従来技術も知られている。情報処理装置が処理要求を受けてから当該処理要求に応答するまでの平均応答時間を制御する制御装置であって、平均応答時間の目標値である目標応答時間を取得する目標応答時間取得部と、処理性能の互いに異なる複数の動作モードの何れかを情報処理装置に設定した場合について、当該動作モードを情報処理装置に設定してから予め定められた基準期間が経過した時点における平均応答時間の予測値である予測応答時間を算出する予測応答時間算出部と、予測応答時間算出部により算出された予測応答時間が目標応答時間未満である場合に、当該動作モードを情報処理装置に設定する動作モード設定部とを備える制御装置を提供するものである（例えば特許文献２）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００１−２５６１３５号公報
【特許文献２】特開２００６−１５５５２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、上記従来技術では、Ｗｅｂサービス毎に、リクエスト種別に対応するＵＲＬ（ユニフォーム・リソース・ロケータ：統一資源位置指定子）の文字列や、呼び出しシーケンスなどの事前知識が必要になり、新規システムへの対応に時間がかかるという問題点を有していた。
【０００８】
近年のＷｅｂサービスは、複雑化しており処理種別が多くなっているため、処理種別を事前に知ることは、困難になりつつある。
そこで、１つの側面では、本発明は、処理種別を自動的に判別できるようにすることを目的とする。
【０００９】
他の側面では、本発明は、この処理種別の自動判別に基づいて、仕掛の処理の残り時間を正しく認識可能とすることを目的とする。
【課題を解決するための手段】
【００１０】
態様の一例では、リクエストに応じて実行されるアプリケーションコードの実行履歴から、前記リクエスト毎の、前記アプリケーションコードに含まれるメソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成し、前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークし、前記重要呼び出しとしてマークされた各ノードのメソッドに識別情報としてのモデル番号を定義し、前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、前記モデル番号を更新するプログラムコードである処理種別判別コードを前記モデル番号遷移表に基づいて生成し、前記アプリケーションコード中のメソッドのプログラムコードに該メソッドのモデル番号を更新する前記処理種別判別コードを挿入する。
【発明の効果】
【００１１】
１態様では、処理種別を自動的に判別することが可能となる。。
また、１態様では、この処理種別の自動判別に基づいて、仕掛の処理の残り時間を正しく認識することが可能となる。
【図面の簡単な説明】
【００１２】
【図１】残り時間問い合わせシーケンスの利用シーンの例の説明図である。
【図２】第１の実施形態のシステム構成図である。
【図３】第１の実施形態におけるスレッドローカル変数領域のデータ構成例の説明図である。
【図４】第１の形態におけるメソッドシーケンス表の作成の処理とデータ構成例の説明図である。
【図５】第１の形態における処理種別分化木の作成処理とデータ構成例の説明図である。
【図６】第１の形態における重要呼び出しの抽出処理の説明図である。
【図７】第１の実施形態におけるモデル番号の付与処理の説明図である。
【図８】第１の実施形態におけるモデル表の作成処理とデータ構成例の説明図である。
【図９】第１の実施形態におけるモデル番号遷移表の作成処理とデータ構成例の説明図である。
【図１０】第１の形態におけるスレッドローカル変数領域を確保するプログラムコードの埋め込み処理の説明図である。
【図１１】第１の実施形態におけるモデル番号を更新するプログラムコードの埋め込み処理の説明図である。
【図１２】第１の実施形態における履歴解析処理と処理種別動的判断コード挿入処理を示すフローチャートである。
【図１３】図１２のステップＳ１の処理の説明図である。
【図１４】図１２のステップＳ２−１の処理の説明図である。
【図１５】図１２のステップＳ２−２の処理の説明図である。
【図１６】図１２のステップＳ２−２の詳細処理を示すフローチャートである。
【図１７】図１２のステップＳ２−４の詳細処理を示すフローチャートである。
【図１８】図１２のステップＳ２−４の処理の説明図である。
【図１９】図１２のステップＳ２−７の処理で使用される平均時間計算用テーブルのデータ構成例を示す図である。
【図２０】図１２のステップＳ２−７の詳細処理を示すフローチャートである。
【図２１】図１２のステップＳ２−７の処理の説明図（その１）である。
【図２２】図１２のステップＳ２−７の処理の説明図（その２）である。
【図２３】図１２のステップＳ２−８の詳細処理を示すフローチャートである。
【図２４】第２の実施形態のシステム構成図である。
【図２５】第２の実施形態におけるメソッド呼び出し回数カウントコード挿入部の説明図である。
【図２６】第３の実施形態のシステム構成図である。
【図２７】第３の実施形態における残り時間算出スレッドの処理を示すフローチャートである。
【図２８】図２７のＳ２７０１の詳細処理を示すフローチャートである。
【図２９】第３の実施形態における残り時間の算出処理の説明図である。
【図３０】第４の実施形態のシステム構成図である。
【図３１】第４の実施形態における残り時間更新のためのメソッド開始時刻記録コードの注入処理の説明図である。
【図３２】第４の実施形態における残り時間更新のためのスレッド終了時間記録コードの注入処理の説明図である。
【図３３】第４の実施形態においてＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹの情報をモデル表へ反映させる処理の説明図（その１）である。
【図３４】第４の実施形態においてＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹの情報をモデル表へ反映させる処理の説明図（その２）である。
【図３５】第１〜第４の実施形態のシステムを実現可能なハードウェアの構成図である。
【発明を実施するための形態】
【００１３】
以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。
図１は、残り時間問い合わせシーケンスの利用シーンの例の説明図である。例えばユーザが操作するクライアントコンピュータ１０１が、「ｈｔｔｐ：／／ａａａ．ｂｂｂ．ｃｃｃ／ｌｏｇｉｎ」というＵＲＬをアクセスアドレスとして指定して、システムにログインする。その結果、サーバコンピュータ１０２からクライアントコンピュータ101に、「Ｃｏｏｋｉｅ  ＩＤ＝ｒｅｑｉｄ１２３４５」として例示されるパラメータにより、リクエストＩＤ「ｒｅｑｉｄ１２３４５」が返される。サーバコンピュータ１０２では、Ｗｅｂサーバのシステムが稼働している。そして、Ｗｅｂサーバは、クライアントコンピュータ１０１からリクエストを受信すると、サーバコンピュータ１０２と同一の（異なってもよい）アプリケーションサーバコンピュータ上で稼働するアプリケーションプログラムに受信したリクエストを発行する。この結果、アプリケーションサーバコンピュータ上では、上記リクエストＩＤ「ｒｅｑｉｄ１２３４５」に対応してスレッドが確保され、そのスレッド上でアプリケーションプログラムの一連のメソッドのシーケンスが実行される。
【００１４】
アプリケーションプログラムは、例えば上記サーバコンピュータ１０２やアプリケーションサーバコンピュータと同一または異なるデータベースサーバコンピュータ上のデータベースにアクセスする。このような処理においては、データベースに対する操作において多くの処理時間が必要となるような場合がある。図１において、クライアントコンピュータ１０１から例えば「ｈｔｔｐ：／／ａａａ．ｂｂｂ．ｃｃｃ／ｈｅａｖｙ_ｔａｓｋ  Ｃｏｏｋｉｅ  ＩＤ＝ｒｅｑｉｄ１２３４５」というような時間がかかる処理がリクエストされた場合を考える。この場合、アプリケーションサーバコンピュータ上で該当するアプリケーションプログラムを実行するスレッドでは、処理に多くの時間を要し、クライアントコンピュータ１０１になかなか応答を返すことができない。
【００１５】
クライアントコンピュータ１０１を操作するユーザは、なかなか応答が返ってこないため、システムがフリーズしたと思ってしまったり、途中で諦めて操作を中止してしまったりする可能性がある。このような状況は、ユーザに対して、サービス性の低下を招く結果となる。そこで、クライアントコンピュータ１０１から例えば、「ｈｔｔｐ：／／ａａａ．ｂｂｂ．ｃｃｃ／ｉｎｑｕｉｒｅ_ｓｔａｔｕｓ  Ｃｏｏｋｉｅ  ＩＤ＝ｒｅｑｉｄ１２３４５」というような残り時間を問い合わせるリクエストを発行できたとする。これを受けて、サーバコンピュータ１０２がリクエストＩＤ「ｒｅｑｉｄ１２３４５」に対応するスレッドの処理の残り時間を算出し、例えば「あと１０秒で終わります」というような応答をクライアントコンピュータ１０１に返すことができる。これにより、クライアントコンピュータ１０１を操作するユーザは、現在のリクエストの処理状況を適切に把握することができるようになり、操作を諦めてしまうというような事態を避けることができるようになり、サービス性が向上する。
【００１６】
以下に説明する各実施形態は、このような処理の残り時間の問い合せサービスを提供することができるシステムである。以下の説明では、説明の便宜上、アプリケーションサーバのシステムは、図１のサーバコンピュータ１０２上で動作しているものとして説明するが、別のサーバコンピュータ上で動作する場合であっても実行場所が違うだけで、同様に実施できる。
【００１７】
図２は、第１の実施形態のシステム構成図であり、図１のサーバコンピュータ１０２上で動作する。このシステムは、特には図示しないＷｅｂサーバのシステムが図１のクライアントコンピュータ１０１から受信したリクエストに基づいて、アプリケーションプログラムを実行するアプリケーションサーバのシステムである。「発明が解決しようとする課題」において前述したように、従来技術では、リクエストの処理種別を事前に知る必要があった。これに対して、第１の実施形態のシステムは、実行履歴の解析によって、自動的に処理種別を判断するプログラムコードをアプリケーションプログラムに挿入することができる技術である。
【００１８】
図２において、Ｗｅｂアプリコード２０１は、クライアントコンピュータ１０１からのリクエストに基づいてＷｅｂサービスを提供するアプリケーションプログラムであり、特には図示しないデータベースシステムなどにアクセスして処理を実行する。Ｗｅｂアプリコード２０１は、例えばＪａｖａプログラミング言語により記述されるアプリケーションプログラムである。ここで、「Ｊａｖａ」は、Ｏｒａｃｌｅ  Ｃｏｒｐｏｒａｔｉｏｎ  及びその子会社、関連会社の米国及びその他の国における登録商標である。Ｗｅｂアプリコード２０１は、図１のサーバコンピュータ１０２内のハードディスク記憶装置などの外部記憶装置に記憶される。そして、実行時に、サーバコンピュータ１０２内のＣＰＵ（中央演算処理装置）によって、外部記憶装置からメモリ（主記憶装置）にロードされて実行される。この際、ＣＰＵによって、リクエストが受け付けられたときには、そのリクエストＩＤに対応するスレッドが使用するメモリ領域が、メモリ上で確保される。
【００１９】
実行履歴取得コード変換部２０２は、Ｗｅｂアプリコード２０１の実行時に、そのコードに含まれる各メソッドの実行開始時刻と実行終了時刻を実行履歴２０４として記録できるようにするためのプログラムコードを、Ｗｅｂアプリコード２０１に埋め込む。この結果、Ｗｅｂアプリコード２０１は、実行履歴取得Ｗｅｂアプリコード２０３に変換される。そして、Ｗｅｂアプリコード２０１の代わりに実行履歴取得Ｗｅｂアプリコード２０３が実行される毎に、実行履歴２０４が記録されてゆく。実行履歴取得コード変換部２０２の処理は、サーバコンピュータ１０２（図１）の内のＣＰＵが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
【００２０】
以上の実行履歴２０４を記録する機能は、Ｗｅｂベースのアプリケーションプログラムのために、通常的に実装される処理である。
履歴解析部２０５は、リクエスト毎のメソッドの呼び出しの実行履歴２０４から、メソッドが含まれる処理種別を判別して、処理種別に含まれるメソッドの呼び出し回数（以下、この呼び出し回数を「メソッド呼び出し回数」と呼ぶ）と処理の残り時間との関係を見積もる。
【００２１】
すなわち、履歴解析部２０５は、実行履歴２０４から、リクエスト毎のメソッドの呼び出しの一連の呼び出し順序パターンを含むシーケンスを分類したメソッド呼び出しシーケンスを取得する。そして、履歴解析部２０５は、メソッド呼び出しシーケンス上で実行される各メソッドの呼び出しからメソッド呼び出しシーケンスの完了までの時間の平均値を計算し、その結果を、後述するメソッドシーケンス表に書き込む。なお、メソッドシーケンスが1回の場合は、各メソッド呼び出しから、シーケンス完了までの時間をメソッドシーケンス表に書き込む。このメソッドシーケンス表のデータ構造は、サーバコンピュータ１０２（図１）内の特には図示しないメモリ上に記憶される。
【００２２】
次に、履歴解析部２０５がプログラムから分化木を作成する。プログラムの各メソッドをノード（節点）に対応させ、各メソッドからメソッドへの遷移を枝に対応してできるグラフ（木）を分化木とする。分化木上の始点から終点までの一つのパスがプログラムのメソッドシーケンスに対応する。履歴解析部２０５は、各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめる。その後、履歴解析部２０５は、共通でないメソッドの呼び出しもノードにし、木構造データである後述する処理種別分化木を作成する。この処理種別分化木のデータ構造は、サーバコンピュータ１０２（図１）内の特には図示しないメモリ上に記憶される。
【００２３】
次に、履歴解析部２０５は、処理種別分化木を構成する各ノードのうち分岐したノードを処理種別を確定する重要呼び出しとしてマークする。その後、履歴解析部２０５は、マークした各重要呼び出しから処理種別分化木に沿って開始ノード方向に向かって各ノードをトラバースする。そして、重要呼び出しと同じメソッドの呼び出しと開始ノードのメソッドの呼び出しについても重要呼び出しとしてさらにマークする。
【００２４】
次に、履歴解析部２０５は、すべての重要呼び出しのメソッドにメソッド名とは異なるユニークな（それぞれ個別の）モデル番号を識別情報のひとつとして定義して処理種別に対応させる。さらに履歴解析部２０５は、メソッドシーケンス表に得られたメソッド呼び出しシーケンス毎およびメソッド呼び出し回数毎の残り時間の平均時間に基づいて、モデル番号毎にメソッド呼び出し回数と処理の残り時間との関係を計算する。これにより、処理種別に含まれるメソッドのメソッド呼び出し回数と処理の残り時間との関係を見積もる。この見積もりの結果は、上記各モデル番号が各行、各メソッド呼び出し回数が各列に配置されたモデル表２０６に書き込まれる。このモデル表２０６のデータ構造は、サーバコンピュータ１０２（図１）内の特には図示しないメモリ上に記憶される。
【００２５】
また、履歴解析部２０５は、上述のモデル番号間の遷移関係を取得し、その遷移関係をモデル番号遷移表２０７に書き込む。モデル番号遷移表２０７のデータ構造は、サーバコンピュータ１０２（図１）内の特には図示しないメモリ上に記憶される。
【００２６】
このように、履歴解析部２０５により、リクエスト毎のメソッドの呼び出しの実行履歴２０４から、メソッドが含まれる処理種別を判別して、メソッドの実行段階と処理種別との遷移関係を取得することができる。具体的には、実行履歴２０４から取得したメソッド呼び出しシーケンス同士の比較で処理種別分化木を作成し、そこで定義される重要呼び出しとしてモデル番号を定義し、モデル番号間の遷移関係をメソッドの実行段階と処理種別との遷移関係として取得できる。第１の実施形態では、このようにメソッドの実行段階と処理種別、具体的にはモデル番号との遷移関係が取得できることで、メソッドの実行段階が判別できれば、処理種別の自動判別が可能となる。
【００２７】
さらに、第１の実施形態では、履歴解析部２０５により、処理種別毎、具体的にはモデル番号毎に、そのモデル番号に対応する処理種別に含まれる各メソッドのメソッド呼び出し回数と処理の残り時間との関係を見積もることができる。これにより、処理種別を自動判別した結果から、さらにメソッド呼び出し回数を取得することにより、現在の処理の残り時間を取得することが可能となる。
以上の履歴解析部２０５の処理は、サーバコンピュータ１０２（図１）の内のＣＰＵが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
【００２８】
処理種別動的判断コード挿入部２０８は、リクエストに基づいて実行が開始されるスレッドに対して現在のモデル番号を含む情報を記録する変数領域であるスレッドローカル変数領域をメモリ上に確保するプログラムコードを自動生成する。また、処理種別動的判断コード挿入部２０８は、スレッドローカル変数領域の記録内容を参照および更新しながら実行中のスレッドにおける現在の処理種別を判別するプログラムコードを自動生成する。そして、処理種別動的判断コード挿入部２０８は、これらの自動生成したプログラムコードを、アプリケーションプログラムであるＷｅｂアプリコード２０１に埋め込む。
【００２９】
より具体的には、処理種別動的判断コード挿入部２０８は、Ｗｅｂアプリコード２０１中のリクエスト時に最初に実行されるメソッドのプログラムコードに、次のようなプログラムコードを自動生成して埋め込む。このプログラムコードは、現在のＭＯＤＥＬＩＤと現在のメソッド呼び出し回数を含む情報を記録するスレッドローカル変数領域を確保する。
【００３０】
また、処理種別動的判断コード挿入部２０８は、Ｗｅｂアプリコード２０１中の各モデル番号に対応する各メソッドのプログラムコードに、次のようなプログラムコードを自動生成して埋め込む。このプログラムコードは、モデル番号遷移表２０７に登録されているモデル番号間の遷移関係に基づいて、スレッドローカル変数領域に現在の処理種別として記憶されている現在のモデル番号に対して次に遷移するモデル番号を決定する。そして、このプログラムコードは、スレッドローカル変数領域のＭＯＤＥＬＩＤの変数値に対応するモデル番号を、上述の決定したモデル番号に更新する。
【００３１】
このようにして、処理種別動的判断コード挿入部２０８によって、Ｗｅｂアプリコード２０１に自動生成されたプログラムコードが埋め込まれ、その結果が、処理種別を動的に判断するＷｅｂアプリコード２０９として出力される。
【００３２】
以上のように、処理種別動的判断コード挿入部２０８により生成された処理種別を動的に判断するＷｅｂアプリコード２０９が実行されることにより、次のような処理が実現される。まず、実行されるスレッド毎にスレッドローカル変数領域が確保されることにより、スレッドの実行状況に応じて、現在のモデル番号を保持することができるようになる。さらに、スレッド上でのメソッドの実行中に、スレッドローカル変数領域中のモデル番号と、履歴解析部２０５が取得したメソッドの実行段階とモデル番号との遷移関係とから、現在のメソッドの実行段階に対応するモデル番号の遷移を判別することが可能となる。そして、スレッドローカル変数領域中のモデル番号を、上記新たに判別されたモデル番号で更新することができる。このようにして、第１の実施形態では、スレッド上でのメソッドの実行中に、その実行段階に応じた処理種別を動的に判別することが可能となる。
【００３３】
以上の処理種別動的判断コード挿入部２０８の機能は、サーバコンピュータ１０２（図１）の内のＣＰＵが、外部記憶装置からメモリにロードされた制御プログラムを実行する処理である。
【００３４】
以下に、上述の構成を有する第１の実施形態の動作についてより具体的に説明する。
図３は、第１の実施形態において、処理種別動的判断コード挿入部２０８によって、スレッド毎にメモリ上に確保されるスレッドローカル変数領域のデータ構成例を示す図である。スレッドローカル変数領域は例えば、スレッドローカル変数管理テーブル３０１と、スレッドローカル変数テーブル３０２とを備える。
【００３５】
スレッドローカル変数管理テーブル３０１には、システム上に存在するテーブルであり、リクエストＩＤとスレッドローカル変数テーブル３０２への参照ポインタ（参照アドレス値）のデータ組が、各スレッドに対応して記憶される。図３の例では、「リクエストＩＤメソッド呼び出し」項目にリクエストＩＤ値１とリクエストＩＤ値２が登録されていることが示されている。参照ポインタは「スレッドローカル変数テーブルへの参照」項目に登録される。前述したように、スレッドローカル変数領域は、スレッド毎に確保される。そして、各スレッドは、各リクエストＩＤに１対１に対応している。従って、あるリクエストＩＤ値が受信されたときに、そのリクエストＩＤ値によってスレッドローカル変数管理テーブル３０１を参照することにより、そのリクエストＩＤに対応するスレッドのスレッドローカル変数領域であるスレッドローカル変数テーブル３０２の記憶アドレスを知ることができる。このスレッドローカル変数テーブル３０２は、処理種別動的判断コード挿入部２０８によって、各リクエストＩＤに対応するスレッドの開始時にメモリ上に確保される。
【００３６】
スレッドローカル変数テーブル３０２には、スレッドにおいて、残り時間を算出するために必要なスレッドローカル変数群が記憶される。スレッドローカル変数群としては例えば、ＭＯＤＥＬＩＤ、ＮＣＡＬＬ、ＥＮＤＴＩＭＥ、ＭＥＴＨＯＤ_ＨＩＳＴＯＲＹの４変数が記憶される。各スレッドローカル変数は、変数インデックスによって参照される。ＭＯＤＥＬＩＤ値の参照時には変数インデックス値１が、ＮＣＡＬＬ値の参照時には変数インデックス値２が、ＥＮＤＴＩＭＥ値の参照時には変数インデックス値３が、ＭＥＴＨＯＤ_ＨＩＳＴＯＲＹ配列値の参照時には変数インデックス値４が各々指定される。なお、残り時間の算出という処理を実現するものであれば、スレッドローカル変数群はこれらの変数群には限定されない。
【００３７】
スレッドローカル変数テーブル３０２において、変数ＭＯＤＥＬＩＤは、スレッドの現在のモデル番号を保持する。また、変数ＮＣＡＬＬは、スレッドにおける現在までの延べのメソッド呼び出し回数を保持する。ＥＮＤＴＩＭＥ値とＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列値については、第４の実施形態の説明において後述する。本特許出願の発明者は、以下に説明するように、現在実行中のスレッドで、モデル番号と、現在のメソッド呼び出し回数がわかれば、スレッドが完了するまでの処理の残り時間を平均値として見積もれることを見出した。
【００３８】
まず、図２に示されるＷｅｂアプリコード２０１は、メソッドと呼ばれるプログラムコードを単位として呼び出される。いま、あるリクエストＩＤに対して確保されるスレッド上で、一連の複数のメソッドが呼び出されて実行されるとき、その一連のメソッド群のことを、メソッド呼び出しシーケンスと呼ぶ。メソッド呼び出しシーケンスの種類は、図２の実行履歴２０４から、リクエストＩＤ毎に実行されるメソッド群のシーケンスを判別することにより抽出し分類することができる。実行履歴２０４上では、ある１つの種類のメソッド呼び出しシーケンスを有するメソッドの呼び出し履歴は、複数組が存在する可能性がある。ここで、そのメソッド呼び出しシーケンスに含まれるノード数をＮ個とする。この場合、そのメソッド呼び出しシーケンス上で第ｎ（１≦ｎ≦Ｎ）番目に呼び出されるメソッドの、実行開始からそのシーケンスの終了までの時間（これを第ｎ番目のメソッドに関する「残り時間」と定義する）は、次のようにして算出できる。実行履歴２０４から、上記ある１つの種類のメソッド呼び出しシーケンスに対する複数組の履歴のそれぞれで、第ｎ番目のメソッドの実行開始からその履歴上のシーケンスの終了までの残り時間を計算し、複数組の履歴間でその残り時間の平均値を計算する。この計算を、第１番目から第Ｎ番目までの全てのノードについて実行する。この結果、上記ある１種類のメソッド呼び出しシーケンス上で第１番目から第Ｎ番目までに呼び出される各ノードについて、残り時間の平均値を見積もることができる。さらに、実行履歴２０４に基づいて分類できるメソッド呼び出しシーケンスの各種類について、各シーケンス上で順次呼び出される各ノードについて、残り時間の平均値を見積もることができる。図２の履歴解析部２０５は、上述のメソッド呼び出しシーケンス毎およびメソッド呼び出し回数毎の残り時間の平均値の計算を実行し、その計算結果をサーバコンピュータ１０２（図１）のメモリ上に記憶領域を確保したメソッドシーケンス表４０１に書き込む。
【００３９】
図４は、第１の実施形態において、履歴解析部２０５によって作成されるメソッドシーケンス表４０１の作成処理とデータ構成例を示す図である。図２の実行履歴２０４の解析結果から、メソッド（図中「ｍｅｔｈｏｄ」と表記）Ａ−Ｂ−Ｂ−Ｃ−Ｄという順で実行されるメソッド呼び出しシーケンスの履歴と、シーケンス内の各メソッドに対応する残り時間が、４０２（＃１）として得られたとする。同様に、メソッドＡ−Ｂ−Ｅという順で実行されるメソッド呼び出しシーケンスの履歴と、シーケンス内の各メソッドに対応する残り時間が、４０２（＃２）として得られたとする。これらのデータより、図４のメソッドシーケンス表４０１の１行目に、メソッドシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と、出現回数＝１回が登録される。また、第１回目のメソッド呼び出しの残り時間として、解析結果４０２（＃１）の「ｍｅｔｈｏｄＡ」の残り時間＝１０秒が登録される。第２回の各残り時間として、４０２（＃１）の「ｍｅｔｈｏｄＢ」の残り時間＝４秒が登録される。第３回の各残り時間として、４０２（＃１）の「ｍｅｔｈｏｄＢ」の残り時間＝３秒が登録される。第４回の各残り時間として、４０２（＃１）の「ｍｅｔｈｏｄＣ」の残り時間＝２秒が登録される。第５回の各残り時間として、４０２（＃１）の「ｍｅｔｈｏｄＤ」の残り時間＝１秒が登録される。次に、メソッドシーケンス表４０１の２行目に、メソッドシーケンス「Ａ−Ｂ−Ｅ」と、出現回数＝１回が登録される。また、第１回目のメソッド呼び出しの残り時間として、解析結果４０２（＃２）の「ｍｅｔｈｏｄＡ」の残り時間＝７秒が登録される。第２回の各残り時間として、４０２（＃２）の「ｍｅｔｈｏｄＢ」の残り時間＝５秒が登録される。第３回の各残り時間として、４０２（＃２）の「ｍｅｔｈｏｄＥ」の残り時間＝１秒が登録される。第４回と第５回の各残り時間は存在しないので、未登録である。ここで、実行履歴２０４から、同じメソッド呼び出しシーケンスが複数組解析された場合には、メソッドシーケンス表４０１の該当する行の出現回数の項目に解析された回数が登録される。そして、各回のメソッド呼び出しの残り時間の項目には、複数組の各残り時間の平均値が計算されて登録される。
【００４０】
上述のように、理想的には、現在実行中のスレッドにおけるメソッド呼び出しシーケンスと現在のメソッド呼び出し回数がわかれば、メソッドシーケンス表４０１から、現在のメソッドに関する残り時間を算出することができる。しかし、各メソッドは独立に呼び出して実行させることが可能である。このため、あるリクエストＩＤによってあるメソッドが実行されている時点では、そのリクエストＩＤにより最終的にスレッド全体として、どの種類のメソッド呼び出しシーケンスが実行されるかは確定できず、シーケンスが枝別れする可能性がある。
【００４１】
しかしながら、あるメソッドが、スレッドの開始から延べで何回目に呼び出されたメソッドであるかがわかれば、そのメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかは、前述のメソッド呼び出しシーケンスの分類結果から、解析可能である。そうすれば、これらの複数組のメソッド呼び出しシーケンスに関するメソッド呼び出し回数毎の残り時間の平均値として、現在のメソッド呼び出し回数に対応する残り時間を算出することが可能となる。
【００４２】
具体的には、図４のメソッドシーケンス表４０１に複数種類に分類されているメソッド呼び出しシーケンス同士で、呼び出し回数毎のメソッド呼び出しを比較する。そして、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しもノードにして、サーバコンピュータ１０２（図１）のメモリ上の記憶領域に、木構造のデータを作成する。
【００４３】
図５は、第１の実施形態における上記木構造である処理種別分化木５０１の作成処理とデータ構成例の説明図である。処理種別分化木５０１において、第１階層のノードには、１回目に呼び出されるメソッドが対応付いている。図５の例では、左端のメソッドＡである。この１回目に呼び出されるメソッドＡは、第２階層以下の全てのノードにつながっている。このため、１回目に呼び出されるメソッドＡの実行後には、図４のメソッドシーケンス表４０１に得られている全ての種類（図４では２種類）のメソッド呼び出しシーケンスが実行される。一般的に、第ｎ階層（ｎ≧１）にあるノード（１つとは限らない）には、ｎ回目に呼び出されるメソッドが対応付いている。そして、このノードより先に接続されている第ｎ＋１階層以上の部分が、例えば２通りの経路に分岐しているとすれば、そのｎ回目に呼び出されるメソッドの実行後には２通りのメソッド呼び出しシーケンスが実行されることになる。図５の例では、第２階層（左端から２番目）にあるノードには、第２回目に呼び出されるメソッドＢが対応付いている。そして、このノードより先に接続されている第３階層（左端から３番目）以上の部分は、２通りの経路に分岐しているため、２回目に呼び出されるメソッドの実行後には２通りのメソッド呼び出しシーケンスが実行されることになる。図５の例では、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」中の「Ｂ−Ｃ−Ｄ」という部分と、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」中の「Ｅ」という部分である。また、図５の例では、第３階層（左端から３番目）にあるノードには、第３回目に呼び出されるメソッドＢまたはＥが対応付いている。そして、メソッドＢのほうのノードより先に接続されている第４階層（左端から４番目）以上の部分は、「Ｃ−Ｄ」という１通りの経路のみである。このため、３回目に呼び出されるメソッドＢの実行後には１通りのメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」中の「Ｃ−Ｄ」という部分のみが実行される。メソッドＥのほうのノードより先には接続されているノードはないため、この経路ではメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」の１種類が確定する。
【００４４】
以上の処理種別分化木５０１を用いることで、例えば、現在のメソッド呼び出し回数が第１回目でノードＡが実行されているということがわかった場合を考える。この場合、その後には、図４のメソッドシーケンス表４０１に登録されているメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」の２種類が同じ回数実行される可能性があるということがわかる。（図4の例では1回ずつ）このため、図４のメソッドシーケンス表４０１のこれら２つのメソッド呼び出しシーケンス中の各第１回目のメソッド呼び出し回数に対応する残り時間「１０秒」および「７秒」の出現頻度で重みづけした加重平均値８．５秒（=（10秒×1回＋7秒×１回）/(2回)）として、残り時間を見積もることができる。次に、現在のメソッド呼び出し回数が第２回目でノードＢが実行されているということがわかった場合を考える。この場合にも、その後には、図４のメソッドシーケンス表４０１に登録されているメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」の部分「Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」の部分「Ｅ」の２種類が実行される可能性があるということがわかる。このため、図４のメソッドシーケンス表４０１のこれら２つのメソッド呼び出しシーケンス中の各第２回目のメソッド呼び出し回数に対応する残り時間「４秒」および「５秒」の出現頻度で重みづけした加重平均値４．５秒として、残り時間を見積もることができる。さらに、現在のメソッド呼び出し回数が第３回目でノードＢが実行されているということがわかった場合を考える。この場合にも、その後には、図４のメソッドシーケンス表４０１に登録されているメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」の部分「Ｃ−Ｄ」の１種類が実行される可能性があるということがわかる。このため、図４のメソッドシーケンス表４０１のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」中の第３回目のメソッド呼び出し回数に対応する残り時間「３秒」として、残り時間を見積もることができる。一方、現在のメソッド呼び出し回数が第３回目でノードＥが実行されているということがわかった場合を考える。この場合には、図４のメソッドシーケンス表４０１に登録されているメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」の最後のノード「Ｅ」が実行されたことになる。このため、図４のメソッドシーケンス表４０１のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」中の第３回目のメソッド呼び出し回数に対応する残り時間「１秒」として、残り時間を見積もることができる。
【００４５】
以上のようにして、現在のメソッド呼び出し回数とメソッド名がわかれば、処理種別分化木５０１より、そのメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかが判定可能となる。これにより、判定された組数のメソッド呼び出しシーケンスに関する現在のメソッド呼び出し回数に対応する回数の残り時間の平均値として、現在の残り時間を算出することが可能となる。しかし、残り時間の問合せ要求が発生する毎に上記計算を実行するのでは応答性能が悪い。このため、処理種別分化木５０１から抽出できる全てのノードについて、そのノードに対応するメソッドの実行後に何通りのメソッド呼び出しシーケンスが実行されるかを判定して残り時間の平均値を計算しておき、テーブルに登録しておく。そして、残り時間の問合せ要求の発生時には、現在のメソッド呼び出し回数とメソッド名からそのテーブルを参照することにより、残り時間を高速に見積もることが可能となる。
【００４６】
しかしながら実際には、図１のサーバコンピュータ１０２上で解析される処理種別分化木５０１は相当複雑な構造になることが予想される。従って、その全ての階層の全てのノードについて上記残り時間を計算しておくのは、大規模なアプリケーションサーバシステムにおいては効率的でない。
【００４７】
そこで、本実施形態では、図２の履歴解析部２０５が、処理種別分化木５０１の経路を決定付けるノード、すなわち処理種別を確定するメソッドについてのみ「重要呼び出し」としてマークする。そして、その「重要呼び出し」に対応するメソッドと開始ノードのメソッドとについてのみ、残り時間を計算しておく。
【００４８】
図６は、第１の実施形態における重要呼び出しの抽出処理の説明図である。図２の履歴解析部２０５は、処理種別分化木５０１を構成する各ノードのうち分岐したノードを処理種別を確定する重要呼び出しとしてマークする。例えば図６（ａ）に示される処理種別分化木５０１において、破線の楕円で囲まれた第３階層にある分岐した２つの濃い色のノード（メソッドＢとＥに対応する各ノード）が、重要呼び出しとしてマークされる。その後、履歴解析部２０５は、マークした各重要呼び出しから処理種別分化木５０１に沿って開始ノード方向（図中、左方向）に向かって各ノードをトラバースする。そして、重要呼び出しと同じメソッドのノードと開始ノードについても重要呼び出しとしてさらにマークする。例えば図６（ｂ）に示される処理種別分化木５０１において、第３階層でメソッドＢのノードが重要呼び出しとしてマークされたため、第２階層にある濃い色のメソッドＢのノードも重要呼び出しとしてマークされる。さらに、第１階層にある濃い色のメソッドＡの開始ノードも重要呼び出しとしてマークされる。
【００４９】
次に、図２の履歴解析部２０５は、処理種別分化木５０１上でマークしたすべての重要呼び出しに、ユニークな（それぞれ個別の）モデル番号を定義する。
図７は、第１の実施形態におけるモデル番号の付与処理の説明図である。図７の例では、図６（ｂ）のようにマークされた重要呼び出しの各ノードに、１、２、３、４というモデル番号がそれぞれ付与される。本実施形態では、このようにして重要呼び出しに付与されたモデル番号が定義される。前述したように、個別のメソッド呼び出しシーケンスを直接判別するのが理想的であるが、計算効率を考慮すると、上述のようにして代表的に決定されたモデル番号を介して間接的に処理種別を判別するのがよい。
【００５０】
続いて、図２の履歴解析部２０５は、上述のモデル番号毎にメソッド呼び出し回数と処理の残り時間との関係を計算し、モデル表２０６に記憶する。
図８は、第１の実施形態におけるモデル表２０６の作成処理とデータ構成例の説明図である。まず、履歴解析部２０５は、サーバコンピュータ１０２（図１）のメモリ上にモデル表２０６の記憶領域を確保する。次に、履歴解析部２０５は、処理種別分化木５０１上で付与したモデル番号毎にモデル表２０６にエントリ（表の行データ）を作成し、「モデル番号」項目に各モデル番号を登録する。また、モデル表２０６の「Ｍｅｔｈｏｄ名」項目に各モデル番号に対応するメソッド名を登録する。図８の例では、モデル番号１、２、３、４にそれぞれ対応する各エントリが作成され、メソッド名としてＡ、Ｂ、Ｂ、Ｅが登録される。次に、履歴解析部２０５は、モデル表２０６の各モデル番号のエントリに対応して、図５に例示される処理種別分化木５０１より、そのモデル番号を含む何通りのメソッド呼び出しシーケンスが実行されるかを判定する。次に、判定された組数のメソッド呼び出しシーケンスに関する各メソッド呼び出し回数に対応する各残り時間の平均値を計算する。そして、その計算した各残り時間の平均値を、モデル表２０６上の各モデル番号のエントリの各メソッド呼び出し回数に対応する項目に登録する。
【００５１】
図８の例では、例えば、モデル番号１に関しては、図８に示される処理種別分化木５０１より、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」の２種類が実行される可能性があるということがわかる。これより、図４のメソッドシーケンス表４０１のこれら２つのメソッド呼び出しシーケンス中の各第１回目のメソッド呼び出し回数に対応する残り時間「１０秒」および「７秒」の頻度で重みづけした加重平均値８．５秒（=（10秒×1回＋7秒×１回）/(2回)）として、第１回目のメソッド呼び出しの残り時間を計算できる。また、メソッドシーケンス表４０１の上記２つのメソッド呼び出しシーケンス中の各第２回目のメソッド呼び出し回数に対応する残り時間「４秒」および「５秒」の出現頻度で重みづけした加重平均値４．５秒として、第２回目のメソッド呼び出しの残り時間を計算できる。また、メソッドシーケンス表４０１の上記２つのメソッド呼び出しシーケンス中の各第３回目のメソッド呼び出し回数に対応する残り時間「３秒」および「１秒」の出現頻度で重みづけした加重平均値２秒として、第３回目のメソッド呼び出しの残り時間を計算できる。さらに、メソッドシーケンス表４０１の上記２つのメソッド呼び出しシーケンス中の各第４回目のメソッド呼び出し回数に対応する残り時間「２秒」および「０秒」（登録無し）の平均値１秒として、第４回目のメソッド呼び出しの残り時間を計算できる。そして、メソッドシーケンス表４０１の上記２つのメソッド呼び出しシーケンス中の各第５回目のメソッド呼び出し回数に対応する残り時間「１秒」および「０秒」（登録無し）の出現頻度で重みづけした加重平均値０．５秒として、第５回目のメソッド呼び出しの残り時間を計算できる。
【００５２】
図８において、モデル番号２に関しては、図８に示される処理種別分化木５０１より、モデル番号１の場合と同様に、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」の２種類が実行される可能性があるということがわかる。これより、モデル番号２に対応する各メソッド呼び出し回数に対応する各残り時間は、モデル番号１の場合と同様となる。
【００５３】
図８において、モデル番号３に関しては、図８に示される処理種別分化木５０１より、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」の１種類のみが実行されることがわかる。これより、図４のメソッドシーケンス表４０１の上記メソッド呼び出しシーケンス中の各メソッド呼び出し回数に対応して登録されている各残り時間がそのまま、モデル番号３に対応する各メソッド呼び出し回数に対応する各残り時間として登録される。すなわち、第１回目、第２回目、第３回目、第４回目、第５回目の各メソッド呼び出し回数に対応する各残り時間として、１０秒、４秒、３秒、２秒、１秒が登録される。
【００５４】
図８において、モデル番号４に関しては、図８に示される処理種別分化木５０１より、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」の１種類のみが実行されることがわかる。これより、図４のメソッドシーケンス表４０１の上記メソッド呼び出しシーケンス中の各メソッド呼び出し回数に対応して登録されている各残り時間がそのまま、モデル番号４に対応する各メソッド呼び出し回数に対応する各残り時間として登録される。すなわち、第１回目、第２回目、第３回目、第４回目、第５回目の各メソッド呼び出し回数に対応する各残り時間として、７秒、５秒、１秒、０秒、０秒が登録される。なお、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」に関しては、第４回目および第５回目のメソッド呼び出し回数は存在しないが、それぞれ便宜上０秒が登録される。
【００５５】
このようにして作成されたモデル表２０６を使用すれば、残り時間の問合せ要求時に、対象スレッド上でいずれかのモデル番号に対応するメソッドが実行されたことを判別でき、かつメソッド呼び出し回数を判別できれば、残り時間を取得することができる。例えば図８において、残り時間の問合せ要求時に、モデル番号＝４が判別できかつメソッド呼び出し回数＝３回が判別できれば、モデル表２０６のモデル番号＝４に対応するエントリのメソッド呼び出し回数＝３に対応する項目の残り時間＝１秒が取得される。そして、この残り時間＝１秒が、残り時間の問合せ要求時に対して応答される。
【００５６】
なお、処理種別分化木５０１の性質から、残り時間の問合せ要求が対象スレッドでの実行上後になるほど、それより後に実行される可能性のメソッド呼び出しシーケンスの候補数は少なくなる。このため、残り時間の問合せ要求時に判別できるモデル番号の値が大きくなるほど、残り時間が平均化される度合いが少なくなるため、正確な残り時間を算出できるようになる。しかし、対象スレッド上早い実行時点で残り時間の問合せ要求が発生したとしても、本実施形態では、その後に実行される可能性のある複数組のメソッド呼び出しシーケンスから求まる平均値として、適切な残り時間を応答することが可能となる。
【００５７】
ここで、図２の履歴解析部２０５は、後述するモデル番号遷移表２０７の作成のために、処理種別分化木５０１を参照して、モデル表２０６の各モデル番号のエントリの「直前モデル番号」項目に、各モデル番号の直前に実行されるモデル番号を登録しておく。例えば図８のモデル表２０６のモデル番号＝２のエントリの「直前モデル番号」項目には、モデル番号＝２の直前のモデル番号＝１が登録される。また、モデル番号＝３のエントリの「直前モデル番号」項目には、モデル番号＝３の直前のモデル番号＝２が登録される。モデル番号＝４のエントリの「直前モデル番号」項目にも、処理種別分化木５０１より、モデル番号＝４の直前のモデル番号＝２が登録される。なお、モデル番号＝１は先頭のモデル番号であるため、モデル番号＝１のエントリの「直前モデル番号」項目は未登録となる。
【００５８】
最後に、図２の履歴解析部２０５は、モデル表２０６の「直前モデル番号」項目の登録内容に基づいて、メソッド毎に、モデル番号間の遷移関係を取得し、その遷移関係をメモリ上に記憶領域を確保したモデル番号遷移表２０７に書き込む。
【００５９】
図９は、第１の実施形態におけるモデル番号遷移表２０７の作成処理とデータ構成例の説明図である。履歴解析部２０５はまず、図８のモデル表２０６において、最初のモデル番号＝１のエントリの「Ｍｅｔｈｏｄ名」項目に登録されているメソッド名＝Ａを識別する。このメソッド名＝Ａに関して、モデル番号＝１のエントリの「直前モデル番号」項目は未登録である。この結果、履歴解析部２０５は、モデル番号遷移表２０７にメソッドＡに対応する第１番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドＡのメソッド名（図中、「ｍｅｔｈｏｄＡ」と表記）を登録する。また、このエントリの「モデル番号遷移」項目に、「＊−＞１」という遷移関係を登録する。この遷移関係において、「＊」は未登録状態、「１」はモデル番号＝１を示す。また、「−＞」は、この矢印の左側に表記される項目から右側に表記される項目にモデル番号が遷移することを示している。すなわち、「＊−＞１」は、スレッド上で現在実行されているメソッドがＡの場合に、直前のモデル番号が未登録であれば、現在のモデル番号を１に遷移させることを示している。これは、例えば図７に示される処理種別分化木５０１上で、現在のメソッドＡが最初に実行されるモデル番号に対応するメソッドであるときには、現在のスレッドのモデル番号を１に遷移すべきであることを示している。
【００６０】
次に、履歴解析部２０５は、図８のモデル表２０６において、第２番目のモデル番号＝２のエントリの「Ｍｅｔｈｏｄ名」項目に登録されているメソッド名＝Ｂを識別する。このメソッド名＝Ｂは、さらにモデル表２０６のモデル番号＝３のエントリの「Ｍｅｔｈｏｄ名」項目にも登録されている。そこで、履歴解析部２０５は、モデル番号＝２とモデル番号＝３の各エントリの「直前モデル番号」項目を参照する。モデル番号＝２の「直前モデル番号」項目にはモデル番号＝１が登録されている。一方、モデル番号＝３の「直前モデル番号」項目にはモデル番号＝２が登録されている。この結果、履歴解析部２０５は、モデル番号遷移表２０７にメソッドＢに対応する第２番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドＢのメソッド名（図中、「ｍｅｔｈｏｄＢ」と表記）を登録する。また、このエントリの「モデル番号遷移」項目に、「１−＞２、２−＞３」という遷移関係を登録する。遷移関係「１−＞２」は、スレッド上で現在実行されているメソッドがＢの場合に、直前のモデル番号が１であれば、現在のモデル番号を２に遷移させることを示している。これは、例えば図７に示される処理種別分化木５０１上で、今までモデル番号＝１のメソッドＡが実行されていた状態から、現在がメソッドＢの実行状態になったときには、現在のスレッドのモデル番号を２に遷移すべきであることを示している。また、遷移関係「２−＞３」は、スレッド上で現在実行されているメソッドがＢの場合に、直前のモデル番号が２であれば、現在のモデル番号を３に遷移させることを示している。これは、例えば図７に示される処理種別分化木５０１上で、今までモデル番号＝２のメソッドＢが実行されていた状態から、現在も同じくメソッドＢの実行状態になったときには、現在のスレッドのモデル番号を３に遷移すべきであることを示している。
【００６１】
次に、履歴解析部２０５は、図８のモデル表２０６において、第３番目のモデル番号＝３のエントリの「Ｍｅｔｈｏｄ名」項目に登録されているメソッド名＝Ｂを識別するが、メソッドＢは既に処理済みであるためスキップする。この結果、履歴解析部２０５は、図８のモデル表２０６において、第４番目のモデル番号＝４のエントリの「Ｍｅｔｈｏｄ名」項目に登録されているメソッド名＝Ｅを識別する。履歴解析部２０５は、モデル番号＝４のエントリの「直前モデル番号」項目を参照する。モデル番号＝４の「直前モデル番号」項目にはモデル番号２が登録されている。この結果、履歴解析部２０５は、モデル番号遷移表２０７にメソッドＥに対応する第３番目のエントリを作成する。そして、このエントリの「メソッド」項目にメソッドＥのメソッド名（図中、「ｍｅｔｈｏｄＥ」と表記）を登録する。また、このエントリの「モデル番号遷移」項目に、「２−＞４」という遷移関係を登録する。この遷移関係「２−＞４」は、スレッド上で現在実行されているメソッドがＥの場合に、直前のモデル番号が２であれば、現在のモデル番号を４に遷移させることを示している。これは、例えば図７に示される処理種別分化木５０１上で、今までモデル番号＝２のメソッドＢが実行されていた状態から、現在がメソッドＥの実行状態になったときには、現在のスレッドのモデル番号を４に遷移すべきであることを示している。
【００６２】
以上のようにして、図２の履歴解析部２０５の処理により、残り時間の問合せ要求に対して、モデル番号とメソッド呼び出し回数とから残り時間を取得して応答するためのモデル表２０６を作成することができる。また、履歴解析部２０５の処理により、このモデル表２０６を参照するときの現在のモデル番号を取得するためのモデル番号遷移表２０７を作成することができる。
【００６３】
次に、図２の処理種別動的判断コード挿入部２０８の動作についてより具体的に説明する。
まず、処理種別動的判断コード挿入部２０８は、Ｗｅｂアプリコード２０１中のリクエストの受信時に最初に実行されるメソッドのプログラムコードに、図３に例示したスレッドローカル変数領域を確保するプログラムコードを埋め込む。
【００６４】
図１０は、第１の実施形態におけるスレッドローカル変数領域を確保するプログラムコードの埋め込み処理の説明図である。いま、図２のＷｅｂアプリコード２０１が例えばＪａｖａプログラミング言語により記述されるサーブレット（Ｓｅｒｖｌｅｔ）と呼ばれるサーバプログラムである場合を考える。この場合に、図１のクライアントコンピュータ１０１からリクエストＩＤを有するリクエストが受信されたときに最初に実行されるメソッドは、「ｄｏＧｅｔ（）」または「ｄｏＰｏｓｔ（）」と呼ばれるトップレベルルーチンである。「ｄｏＧｅｔ（）」は、図１のクライアントコンピュータ１０１から、ＨＴＴＰ（ハイパー・テキスト・トランスファ・プロトコル）によるＧｅｔアクセスと呼ばれるリクエスト形式のデータを受信するルーチンである。「ｄｏＰｏｓｔ（）」は、クライアントコンピュータ１０１から、ＨＴＴＰ（ハイパー・テキスト・トランスファ・プロトコル）によるＰｏｓｔアクセスと呼ばれるリクエスト形式のデータを受信するルーチンである。ＨＴＴＰの場合、図１のクライアントコンピュータ１０１からサーバコンピュータ１０２へは、リクエストはＧｅｔアクセスまたはＰｏｓｔアクセスのいずれかのデータ形式で送信される。ｄｏＧｅｔ（）メソッドを例にして説明する。なお、ｄｏＰｏｓｔ（）メソッドの場合も同様である。図１０において、１００１は、ｄｏＧｅｔ（）メソッドのプログラムコード例であり、図２のＷｅｂアプリコード２０１の一部である。１００２は、ｄｏＧｅｔ（）メソッドプログラムコード１００１を処理種別動的判断コード挿入部２０８による変換後のｄｏＧｅｔ（）メソッドのプログラムコードであり、図２の処理種別を動的に判断するＷｅｂアプリコード２０９の一部である。処理種別動的判断コード挿入部２０８は、ｄｏＧｅｔ（）メソッドのプログラムコード内の最初に実行される行の手前に、リクエストＩＤを生成するプログラムコード（リクエストＩＤが付与されていない場合）を埋め込む。続けて、図２または図８のモデル表２０６とモデル番号遷移表２０７がまだ生成されていない場合に、それらをメモリ上に生成するプログラムコードが埋め込まれる。さらに続けて、スレッドローカル変数領域を確保するプログラムコードが埋め込まれる。スレッドローカル変数領域は、図３のスレッドローカル変数管理テーブル３０１から参照されるスレッドローカル変数テーブル３０２に対応する。このプログラムコードによって、まず、スレッドローカル変数管理テーブル３０１上にリクエストＩＤのエントリが作成される。次に、そのエントリの「リクエストＩＤメソッド呼び出し」項目にリクエストＩＤ値が登録される。さらに、メモリ上でスレッドローカル変数テーブル３０２の記憶領域が確保された後に、その記憶領域の先頭アドレスへのポインタが、スレッドローカル変数管理テーブル３０１上の上記エントリの「スレッドローカル変数テーブルへの参照」項目に登録される。処理種別動的判断コード挿入部２０８は、ｄｏＧｅｔ（）メソッドのプログラムコード内の最後に実行される行の直後に、リクエストＩＤに対応するスレッドのスレッドローカル変数領域を解放するプログラムコードを埋め込む。このプログラムコードにより、スレッド上での全てのメソッド呼び出しシーケンスが終了してトップレベルルーチンのｄｏＧｅｔ（）メソッドが処理を終了するときに、そのスレッドに対応して確保されていたスレッドローカル変数領域が解放される。具体的には、このプログラムコードにより、図３の該当するスレッドローカル変数テーブル３０２の記憶領域が解放され、スレッドローカル変数管理テーブル３０１上の該当するリクエストＩＤに対応するエントリが削除される。
【００６５】
次に、処理種別動的判断コード挿入部２０８は、Ｗｅｂアプリコード２０１中の各モデル番号に対応する各メソッドのプログラムコードの先頭に、モデル番号を判別して更新するためのモデル判別コードを自動生成して埋め込む。
【００６６】
図１１は、第１の実施形態におけるモデル番号を更新するモデル判別コードの埋め込み処理の説明図である。前述したように、メモリ上に生成されているモデル番号遷移表２０７において、例えばメソッドＢに対応するエントリには、履歴解析部２０５によって、モデル番号の遷移関係として「１−＞２」と「２−＞３」が登録されている。これに対応して、処理種別動的判断コード挿入部２０８は、図１１に示されるように、図２のＷｅｂアプリコード２０１の一部であるメソッドＢのプログラムコード１１０１に対して、１１０２内に示されるようなモデル判別コードを埋め込む。この結果、処理種別動的判断コード挿入部２０８は、処理種別を動的に判断するＷｅｂアプリコード２０９の一部として、メソッドＢのプログラムコード１１０２を生成する。
【００６７】
プログラムコード１１０２において、メソッドＢにおいて実行される最初のプログラムコードの直前には、「if(MODELID==1)MODELID=2;」というモデル判別コードが埋め込まれる。このモデル判別コードは、図３のスレッドローカル変数管理テーブル３０１からスレッドローカル変数テーブル３０２中のＭＯＥＤＬＩＤ変数の値であるＭＯＥＤＬＩＤ値を参照する。そして、ＭＯＥＤＬＩＤ値が１であるときには、そのＭＯＥＤＬＩＤ値に２を代入する。このモデル判別コードは、遷移関係「１−＞２」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがＢの場合に、スレッドローカル変数テーブル３０２の直前のＭＯＥＤＬＩＤ値が１であれば、そのＭＯＥＤＬＩＤ値を２にして現在のモデル番号を２に遷移させるモデル判別コードである。これは、例えば図７の第２階層目のモデル番号＝２におけるメソッドＢの実行に相当する。
【００６８】
プログラムコード１１０２において、上記１行目のモデル判別コードに続いて、「else if(MODELID==2)MODELID=3;」というモデル判別コードが埋め込まれる。このモデル判別コードは、上記スレッドローカル変数テーブル３０２中のＭＯＥＤＬＩＤ値が２であるときには、そのＭＯＥＤＬＩＤ値に３を代入する。このモデル判別コードは、遷移関係「２−＞３」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがＢの場合に、スレッドローカル変数テーブル３０２の直前のＭＯＥＤＬＩＤ値が２であれば、そのＭＯＥＤＬＩＤ値を３にして現在のモデル番号を３に遷移させるモデル判別コードである。これは、例えば図７の第３階層目のモデル番号＝３におけるメソッドＢの実行に相当する。
【００６９】
プログラムコード１１０２において、上記２行目のモデル判別コードに続いて、「else { /* Do nothing */ }」というプログラムコードが埋め込まれる。このプログラムは、上記１行目と２行目のいずれの条件も満たされなかった場合に、空処理を実行する、すなわち何も実行しないことを示している。なお、「/* Do nothing */」という記述は、プログラムコード中のコメント文であり、プログラムコードの実行には影響しない。
【００７０】
図１１において、モデル番号遷移表２０７に登録されているメソッドＡやメソッドＥについては、特には図示しないが、メソッドＢの場合と同様に、各メソッドのプログラムコードにモデル番号を更新するためのモデル判別コードが埋め込まれる。前述したように、メモリ上に生成されているモデル番号遷移表２０７において、例えばメソッドＡに対応するエントリには、履歴解析部２０５によって、モデル番号の遷移関係として「＊−＞１」が登録されている。これに対応して、処理種別動的判断コード挿入部２０８は、メソッドＡのプログラムコードに関して、図２のＷｅｂアプリコード２０１を処理種別を動的に判断するＷｅｂアプリコード２０９に変換する。このプログラムコードにおいて、メソッドＡにおいて実行される最初のプログラムコードの直前には、例えば「unless(MODELID)MODELID=1;」というモデル判別コードが埋め込まれる。このモデル判別コードは、スレッドローカル変数テーブル３０２中のＭＯＥＤＬＩＤ値が０または未登録であるときには、そのＭＯＥＤＬＩＤ値に１を代入する。このモデル判別コードは、遷移関係「＊−＞１」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがＡの場合に、スレッドローカル変数テーブル３０２の直前のＭＯＥＤＬＩＤ値が０または未登録であれば、そのＭＯＥＤＬＩＤ値を１にして現在のモデル番号を１に遷移させるモデル判別コードである。これは、例えば図７の第１階層目のモデル番号＝１におけるメソッドＡの実行に相当する。また、図１１のモデル番号遷移表２０７において、例えばメソッドＥに対応するエントリには、履歴解析部２０５によって、モデル番号の遷移関係として「２−＞４」が登録されている。これに対応して、処理種別動的判断コード挿入部２０８は、メソッドＥのプログラムコードに関して、図２のＷｅｂアプリコード２０１を処理種別を動的に判断するＷｅｂアプリコード２０９に変換する。このプログラムコードにおいて、メソッドＥにおいて実行される最初のプログラムコードの直前には、例えば「if(MODELID==2)MODELID=4;」というモデル判別コードが埋め込まれる。このモデル判別コードは、スレッドローカル変数テーブル３０２中のＭＯＥＤＬＩＤ値が２であるときには、そのＭＯＥＤＬＩＤ値に４を代入する。このモデル判別コードは、遷移関係「２−＞４」の動作を実現するものである。すなわち、スレッド上で現在実行されているメソッドがＥの場合に、スレッドローカル変数テーブル３０２の直前のＭＯＥＤＬＩＤ値が２であれば、そのＭＯＥＤＬＩＤ値を４にして現在のモデル番号を４に遷移させるモデル判別コードである。これは、例えば図７の第３階層目のモデル番号＝４におけるメソッドＥの実行に相当する。
【００７１】
以上のようにして図２の処理種別動的判断コード挿入部２０８によって得られた処理種別を動的に判断するＷｅｂアプリコード２０９が、図１のユーザコンピュータからのリクエストの受信時に、Ｗｅｂアプリコード２０１の代わりに実行される。この結果、現在実行中のスレッドにおいて、現在のメソッドが例えば図７の処理種別分化木５０１中のどのモデル番号までが実行されているかを、スレッドローカル変数テーブル３０２（スレッドローカル変数領域）中のＭＯＥＤＬＩＤ値として把握することが可能となる。
【００７２】
以上のようにして、第１の実施形態では、現在実行中のスレッドにおいてどのモデル番号までのメソッドが実行されているかを常に把握することが可能となる。これと共に、後述する第２の実施形態により現在実行中のスレッドにおけるメソッド呼び出し回数を把握することで、図８のように作成されたモデル表２０６を参照して、現在実行中のスレッドにおける処理の残り時間を取得することが可能となる。第２の実施形態で後述するように、図３のスレッドローカル変数テーブル３０２（スレッドローカル変数領域）のＮＣＡＬＬ変数には、ＮＣＡＬＬ値として、現在実行中のスレッドにおけるメソッド呼び出し回数が得られる。図１のクライアントコンピュータ１０１からリクエストＩＤを指定して残り時間の問合せ要求が受信された場合に、リクエストＩＤで図３のスレッドローカル変数管理テーブル３０１がアクセスされることにより、該当するスレッドローカル変数テーブル３０２が参照される。この結果、スレッドローカル変数テーブル３０２からＭＯＥＤＬＩＤ値とＮＣＡＬＬ値が読み出される。そして、モデル表２０６において、ＭＯＥＤＬＩＤ値に対応するモデル番号のエントリ行のＮＣＡＬＬ値に対応するメソッド呼び出し回数の項目に登録されている残り時間が取得され、クライアントコンピュータ１０１に応答される。例えば、スレッドローカル変数テーブル３０２からＭＯＥＤＬＩＤ値＝４、ＮＣＡＬＬ値＝３が得られたとする。この場合、モデル表２０６上のモデル番号＝４に対応するエントリ行のメソッド呼び出し回数＝３の項目に対応する残り時間＝１秒が取得され、クライアントコンピュータ１０１に応答される。
【００７３】
このようにして、第１の実施形態では、残り時間を応答するために処理種別を事前に知る必要がなく、現在実行中のスレッドに対応する処理種別をモデル番号として自動的に取得し、適切な残り時間を応答することが可能となる。
【００７４】
図１２は、図２の機能ブロックによって示される第１の実施形態のシステムの制御処理を示すフローチャートである。このフローチャートは、例えば図３７で後述するサーバコンピュータ１０２（図１）のハードウェア構成で、ＣＰＵ（中央演算処理装置）３７０１が外部記憶装置３７０５に記憶された制御プログラムをメモリ３７０２にロードして実行する処理である。
【００７５】
まず、ステップＳ１は、図２の実行履歴取得コード変換部２０２の処理である。ここでは、既存プロファイル技術を使って、図２に示されるメソッドの実行履歴２０４が取得される。
【００７６】
次に、ステップＳ２−１からＳ２−８までは、図２の履歴解析部２０５の処理に対応する処理である。
まず、リクエスト毎すなわちスレッドＩＤ（リクエストＩＤ）毎に図２の実行履歴２０４が分割される（ステップＳ２−１）。
【００７７】
次に、リクエスト毎にメソッド開始からスレッドが完了するまでの残り時間が計算され、また、終了に関する情報が取り除かれる（ステップＳ２−２）。
次に、図４で説明しように、実行履歴２０４から抽出されるメソッド呼び出しシーケンス毎に、出現回数がカウントされる。そして、前述したように、シーケンス中の各メソッド呼び出し回数に対応するメソッド毎に、各メソッドの開始から完了までの時間の平均値が計算されて、図４のメソッドシーケンス表４０１に登録される（ステップＳ２−３）。
【００７８】
次に、図５で説明した処理種別分化木５０１が作成される（ステップＳ２−４）。
次に、図６で説明したように、処理種別を確定するメソッド呼び出しが「重要呼び出し」としてマークされる。その後、マークした各重要呼び出しから図５の処理種別分化木５０１のメソッド呼び出しシーケンスに沿って開始ノード方向に向かって各ノードがトラバースされる。そして、重要呼び出しと同じメソッドのノードと開始ノードについても、重要呼び出しとしてさらにマークされる（以上、ステップＳ２−５）。
【００７９】
次に、図７で説明したように、すべての「重要呼び出し」にユニークなモデル番号が付与される（ステップＳ２−６）。
次に、図８で説明したように、各モデル番号毎に、メソッド呼び出し回数毎のメソッド開始から完了までの平均の残り時間が計算され、モデル表２０６に登録される（ステップＳ２−７）。
【００８０】
最後に、図９で説明したように、メソッド毎に、モデル番号間の遷移関係が取得され、モデル番号遷移表２０７に書き込まれる（ステップＳ２−８）。
次に、ステップＳ３−１とＳ３−２は、図２の処理種別動的判断コード挿入部２０８の機能に対応する処理である。
【００８１】
まず、図１１で説明したように、モデル番号遷移表２０７に基づいて、Ｗｅｂアプリコード２０１中の各モデル番号に対応する各メソッドのプログラムコードの先頭に、モデル番号を判別し更新するためのモデル判別コードが自動生成されて埋め込まれる（ステップＳ３−１）。
【００８２】
そして、図１０で説明したように、トップレベルルーチンのスレッドの先頭に、スレッド開始時に図３のスレッドローカル変数テーブル３０２を確保する処理、スレッド終了時にスレッドローカル変数テーブル３０２を開放するプログラムコードが埋め込まれる（ステップＳ３−２）。
【００８３】
図１３は、図１２のステップＳ１の処理の説明図である。いま、オリジナルコードであるＷｅｂアプリコード２０１として、図１３に示されるプログラムコードがあるとする。
このプログラムコードでは、例えばメソッドＡのプログラムコードｍｅｔｈｏｄＡ内で、もし変数ｆｌａｇの値が真（＝Ｔ）が偽かで処理が別れる。変数ｆｌａｇの値が真（＝Ｔ）ならば（「if(flag==T」）、メソッドＢのプログラムコードｍｅｔｈｏｄＢ、続いて同じくｍｅｔｈｏｄＢ、その後、メソッドＣのプログラムコードｍｅｔｈｏｄＣが実行される。これは、図４で前述したメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」のうちの「Ａ−Ｂ−Ｂ−Ｃ」のシーケンス部分に対応する。変数ｆｌａｇの値が真（＝Ｔ）ならば（「」else{」）、ｍｅｔｈｏｄＢ、続いてメソッドＥのプログラムコードｍｅｔｈｏｄＥが実行される。これは、図４で前述したメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」に対応する。更に、メソッドＣのプログラムコードｍｅｔｈｏｄＣでは、その中でメソッドＤｎｏプログラムコードｍｅｔｈｏｄＤが実行される。これは、図４で前述したメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」のうちの「Ｃ−Ｄ」のシーケンス部分に対応する。
【００８４】
図２の実行履歴取得コード変換部２０２は、上述のＷｅｂアプリコード２０１内の各メソッドのプログラムコードの先頭に、実行履歴２０４を取得するためのプログラムコードを埋め込み、実行履歴取得Ｗｅｂアプリコード２０３に変換する。この実行履歴取得Ｗｅｂアプリコード２０３は、例えばＪａｖａａｓｓｉｓｔなどと呼ばれるバイトコード変換プログラムを使用し、処理スレッドＩＤ、実行開始／実行終了の別、メソッド名、時刻などを実行履歴２０４として記録する。図１３の例では、１６：１０：１０（１６時１０分１０秒）に、スレッドＩＤ＝１のｍｅｔｈｏｄＡが実行を開始した。次に、１６：１０：１６に、スレッドＩＤ＝１のｍｅｔｈｏｄＢが実行を開始した。次に、１６：１０：１７に、スレッドＩＤ＝１のｍｅｔｈｏｄＢが実行を終了した。次に、１６：１０：１７に、スレッドＩＤ＝１のｍｅｔｈｏｄＢが実行を開始した。次に、１６：１０：１８に、スレッドＩＤ＝１のｍｅｔｈｏｄＢが実行を終了した。次に、１６：１０：１８に、スレッドＩＤ＝１のｍｅｔｈｏｄＣが実行を開始した。次に、１６：１０：１９に、スレッドＩＤ＝１のｍｅｔｈｏｄＤが実行を開始した。次に、１６：１０：１９に、スレッドＩＤ＝１のｍｅｔｈｏｄＤが実行を終了した。次に、１６：１０：２０に、スレッドＩＤ＝１のｍｅｔｈｏｄＣが実行を終了した。そして、１６：１０：２０に、スレッドＩＤ＝１のｍｅｔｈｏｄＡが実行を終了した。一方、１６：２０：００に、スレッドＩＤ＝２のｍｅｔｈｏｄＡが実行を開始した。次に、１６：２０：０２に、スレッドＩＤ＝２のｍｅｔｈｏｄＢが実行を開始した。次に、１６：２０：０３に、スレッドＩＤ＝２のｍｅｔｈｏｄＢが実行を終了した。次に、１６：２０：０５に、スレッドＩＤ＝２のｍｅｔｈｏｄＥが実行を開始した。次に、１６：２０：０６に、スレッドＩＤ＝２のｍｅｔｈｏｄＥが実行を終了した。最後に、１６：２０：０７に、スレッドＩＤ＝１のｍｅｔｈｏｄＡが実行を終了した。
【００８５】
図１４は、図１２のステップＳ２−１の処理の説明図である。ここでは、リクエスト毎すなわちスレッドＩＤ（リクエストＩＤ）毎に、図１３に示されるように得られた実行履歴２０４が、例えば図１４の実行履歴１４０１および１４０２として示されるように分割される。
【００８６】
図１５は、図１２のステップＳ２−２の処理の説明図である。ここでは、図１４のように分割された実行履歴１４０１および１４０２のそれぞれにおいて、最後のメソッドの終了時刻から各メソッドの開始時刻が減算される。この結果、各スレッドＩＤ（リクエストＩＤ）毎の各メソッドについて、各メソッドの開始からスレッドが完了するまでの残り時間が計算され、図１５の残り時間リスト１５０１または１５０２に示されるように得られる。図１５の残り時間リスト１５０１は、ｍｅｔｈｏｄＡ、Ｂ、Ｂ、Ｃ、Ｄのそれぞれについて、残り時間１０秒、４秒、３秒、２秒、１秒が算出される。図１５の残り時間リスト１５０２は、ｍｅｔｈｏｄＡ、Ｂ、Ｅのそれぞれについて、残り時間７秒、５秒、１秒が算出される。
【００８７】
図１６は、図１２のステップＳ２−２の詳細処理を示すフローチャートである。ここでは、図１４のスレッドＩＤ＝１の実行履歴１４０１から図１５のスレッドＩＤ＝１に対応する残り時間リスト１５０１を算出する処理を例にとり説明する。
【００８８】
まず、メモリ上の変数ＥＮＤに、同一スレッドＩＤの実行履歴の中で最も遅い時刻が代入される（ステップＳ１６０１）。図１６に示される実行履歴１４０１の入力例では、１６：１０：２０の時刻が変数ＥＮＤに代入される。
【００８９】
次に、同一スレッドＩＤの実行履歴のうち、実行開始／実行終了の別として実行開始を示す「始」が記憶されている履歴だけが選択されて、それらの選択された履歴がリストとしてメモリ上の変数Ｌに代入される。（ステップＳ１６０２）。図１６に示される実行履歴１４０１の入力例では、以下の履歴群が変数Ｌにリストとして代入される。（ｍｅｔｈｏｄＡ、１６：１０：１０）、（ｍｅｔｈｏｄＢ、１６：１０：１６）、（ｍｅｔｈｏｄＢ、１６：１０：１７）、（ｍｅｔｈｏｄＣ、１６：１０：１８）、（ｍｅｔｈｏｄＤ、１６：１０：１９）である。
【００９０】
次に、変数Ｌの残りの内容（リスト）が空になったか否かが判定される（ステップＳ１６０３）。
変数Ｌの内容（リスト）が空にならない限り、ステップＳ１６０３の判定がＮｏとなり、変数Ｌから履歴が１組ずつ取り出されながら、以下のステップＳ１６０４からＳ１６０６までの処理が繰り返し実行される。
【００９１】
まず、変数Ｌからもっとも古い（時間が早い）履歴が取り出されて、メモリ上の変数Ｍに代入される（ステップＳ１６０４）。図１６に示される実行履歴１４０１の入力例では、まず第１番目として（ｍｅｔｈｏｄＡ、１６：１０：１０）が変数Ｍに代入される。
【００９２】
次に、変数Ｍの時刻と変数ＥＮＤの時刻との差が計算され、メモリ上のｄｉｆｆに代入される（ステップＳ１６０５）。上述の第１番目の例では、変数Ｍの時刻「１６：１０：１０」と変数ＥＮＤの時刻１６：１０：２０」との差＝１０秒が変数ｄｉｆｆに代入される。
【００９３】
そして、変数Ｍのメソッド名と変数ｄｉｆｆの内容が残り時間の残り時間リスト１５０１に出力される。上述の第１番目の例では、（ｍｅｔｈｏｄＡ、１０秒）が残り時間リスト１５０１に出力される。
【００９４】
次に、変数Ｌにはまだリストが残っているため、ステップＳ１６０３の判定がＮｏになる。この結果、第２番目として、ステップＳ１６０４で（ｍｅｔｈｏｄＢ、１６：１０：１６）が取り出されて変数Ｍに代入され、ステップ１６０５で時刻１６：１０：１６と１６：１０：２０の差＝４秒が計算されて変数ｄｉｆｆに他移入される。そして、ステップＳ１６０６で（ｍｅｔｈｏｄＢ、４秒）が残り時間リスト１５０１に出力される。
【００９５】
次に、変数Ｌにはまだリストが残っているため、ステップＳ１６０３の判定がＮｏになる。この結果、第３番目として、ステップＳ１６０４で（ｍｅｔｈｏｄＢ、１６：１０：１７）が取り出されて変数Ｍに代入され、ステップ１６０５で時刻１６：１０：１７と１６：１０：２０の差＝３秒が計算されて変数ｄｉｆｆに他移入される。そして、ステップＳ１６０６で（ｍｅｔｈｏｄＢ、３秒）が残り時間リスト１５０１に出力される。
【００９６】
次に、変数Ｌにはまだリストが残っているため、ステップＳ１６０３の判定がＮｏになる。この結果、第４番目として、ステップＳ１６０４で（ｍｅｔｈｏｄＣ、１６：１０：１８）が取り出されて変数Ｍに代入され、ステップ１６０５で時刻１６：１０：１８と１６：１０：２０の差＝２秒が計算されて変数ｄｉｆｆに他移入される。そして、ステップＳ１６０６で（ｍｅｔｈｏｄＣ、２秒）が残り時間リスト１５０１に出力される。
【００９７】
さらに、変数Ｌにはまだリストが残っているため、ステップＳ１６０３の判定がＮｏになる。この結果、第５番目として、ステップＳ１６０４で（ｍｅｔｈｏｄＤ、１６：１０：１９）が取り出されて変数Ｍに代入され、ステップ１６０５で時刻１６：１０：１９と１６：１０：２０の差＝１秒が計算されて変数ｄｉｆｆに他移入される。そして、ステップＳ１６０６で（ｍｅｔｈｏｄＤ、１秒）が残り時間リスト１５０１に出力される。
【００９８】
その後、変数Ｌにはもうリストが残っていないため、ステップＳ１６０３の判定がＹｅｓとなって、図１２のステップＳ２−２の処理を終了する。なお、他のスレッドＩＤ（例えば図１４、図１５のスレッドＩＤ＝２の実行履歴１４０２と残り時間リスト１５０２）についても、同様の処理が実行される。
【００９９】
以上のようにして得られたスレッドＩＤ毎の残り時間リスト１５０１、１５０２等を使って、図１２のステップＳ２−３で、メソッドシーケンス表４０１が作成される。ここでは、まず、１つの残り時間リスト、例えば図１５の１５０１が参照されることにより、メソッド列Ａ−Ｂ−Ｂ−Ｃ−Ｄが抽出され、図４のメソッドシーケンス表４０１の１つのエントリの「メソッドシーケンス」項目に登録される。次に、メソッドシーケンス表４０１の上記エントリの「出現回数」項目に１が登録される。さらに、メソッドシーケンス表４０１の上記エントリの１から５までの各メソッド呼び出し回数の残り時間の項目に、例えば残り時間リスト１５０１中の残り時間列１０秒、４秒、３秒、２秒、１秒がそれぞれ登録される。残り時間リストとして、上記メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と同じ残り時間リストが得られていたら、メソッドシーケンス表４０１の上記エントリの「出現回数」項目の内容がインクリメントされる。また、上記エントリの１から５までの各メソッド呼び出し回数の残り時間の項目には、得られている出現回数分の各メソッド呼び出し回数毎の残り時間の平均値が計算されて登録される。他の残り時間リスト、例えば１５０２については、メソッドシーケンス表４０１に別のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」のためのエントリが作成されて、上記と同様に残り時間が登録されてゆく。
【０１００】
図１７は、図１２のステップＳ２−４の詳細処理を示すフローチャートである。ここでは、処理種別分化木５０１が作成される。この処理の詳細について、図１８（a）〜図１８（f）の説明図を用いながら説明する。
【０１０１】
まず、図４に示すようにしてメソッドシーケンス表４０１に得られている全メソッド呼び出しシーケンスが、１つのグループとされる。具体的には例えば、グループの情報を保持するメモリ上のリスト変数群にメソッド呼び出しシーケンスの文字列が格納される。図４のメソッドシーケンス表４０１の例では、図１８（ａ）に示されるように、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」がグループとされる。また、図１８（ａ）に示されるように、処理種別分化木５０１の処理階層を示すメモリ上の変数Ｎに値１が代入される。続いて、変数Ｎの最大長を保持するメモリ上の変数ＭＡＸＮに、メソッドシーケンス表４０１に登録されているメソッド呼び出しシーケンスのうちの最大メソッド長が登録される。図４のメソッドシーケンス表４０１の例では、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」が最も長くメソッド数は５である。従って、変数ＭＡＸＮ＝５とされる。さらに、図１８（ａ）に示されるように、文字列‘ＲＯＯＴ’がグループの木のルートノードとして登録される。この木のデータは例えば、メモリ上のリスト変数列として保持される。（以上、図１７のステップＳ１７０１）。
【０１０２】
次に、Ｎの値がＭＡＸＮ以下であるか否かが判定される（図１７のステップＳ１７０２）。
Ｎの値がＭＡＸＮ以下でステップＳ１７０２の判定がＹｅｓならば、次の一連の処理が実行される。
【０１０３】
まず、グループ内のメソッド呼び出しシーケンス毎に、Ｎ番目のメソッド名で、それ以下の部分シーケンスがサブグループ分けされる（図１７のステップＳ１７０４）。このサブグループの情報は例えば、メモリ上のリスト変数群を使って保持される。図１８（ａ）の初期状態の例では、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」のＮ＝１番目のメソッド名「Ａ」を先頭にして、部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」を含む１つのサブグループができる。
【０１０４】
次に、各サブグループの先頭メソッドが、それぞれのサブグループのルートノードに設定される（図１７のステップＳ１７０５）。図１８（ｂ）の状態では、部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」とからなるサブグループの先頭メソッド「Ａ」が、そのサブグループのルートノードに設定される。
【０１０５】
次に、各サブグループのルートノードが、現在のグループの木の末端ノードの子ノードとして登録される（図１７のステップＳ１７０６）。図１８（ｂ）の状態では、現在のグループの木のルートノード‘ＲＯＯＴ’（図１８（ａ）参照）に、上記１つのサブグループのルートノード「Ａ」が子ノードとして登録される。この結果、図１８（ｂ）に示されるように、グループの木は「ＲＯＯＴ−Ａ」となる。
【０１０６】
次に、新たなグループとして、上記サブグループの先頭ノード以外の部分シーケンスが含まれる全てのメソッド呼び出しシーケンスが登録され、変数Ｎの値が＋１される（図１７のステップＳ１７０７）。図１８（ｂ）の状態では、先頭ノード「Ａ」以外の部分シーケンス「Ｂ−Ｂ−Ｃ−Ｄ」と「Ｂ−Ｅ」を含むメソッド呼び出しシーケンス部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」が新たなグループとされる。また、変数Ｎ＝２となる。
【０１０７】
次に、再びＮの値がＭＡＸＮ以下であるか否かが判定される（図１７のステップＳ１７０２）。図１８（ｂ）の状態では、Ｎ＝２であるため、ステップＳ１７０２の判定がＹｅｓとなり、再びステップＳ１７０４からＳ１７０７の一連の処理が実行される。図１８（ｂ）の状態から図１８（ｃ）の状態の変化は、次のようになる。まず、図１８（ｂ）の状態の例では、グループ中のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」のＮ＝２番目のメソッド名「Ｂ」を先頭にして、部分シーケンス「Ｂ−Ｂ−Ｃ−Ｄ」と「Ｂ−Ｅ」を含む１つのサブグループができる。次に、図１８（ｂ）の状態で、部分シーケンス「Ｂ−Ｂ−Ｃ−Ｄ」と「Ｂ−Ｅ」とからなるサブグループの先頭メソッド「Ｂ」が、そのサブグループのルートノードに設定される。次に、図１８（ｂ）の状態で、現在のグループの木の末端ノード‘Ａ’（図１８（ｂ）参照）に、上記１つのサブグループのルートノード「Ｂ」が子ノードとして登録される。この結果、図１８（ｃ）に示されるように、グループの木は「ＲＯＯＴ−Ａ−Ｂ」となる。そして、図１８（ｃ）の状態で、先頭ノード「Ｂ」以外の部分シーケンス「Ｂ−Ｃ−Ｄ」と「Ｅ」を含むメソッド呼び出しシーケンス部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」が新たなグループとされ、変数Ｎ＝３となる。
【０１０８】
処理が進み、図１８（ｃ）の状態では、Ｎ＝３であるため、ステップＳ１７０２の判定がＹｅｓとなり、再びステップＳ１７０４からＳ１７０７の一連の処理が実行される。図１８（ｃ）の状態から図１８（ｄ）の状態の変化は、次のようになる。まず、図１８（ｃ）の状態の例では、グループ中のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」と「Ａ−Ｂ−Ｅ」のＮ＝３番目のメソッド名「Ｂ」と「Ｅ」をそれぞれ先頭にして、２つのサブグループができる。それらは、部分シーケンス「Ｂ−Ｃ−Ｄ」を含むサブグループと、「Ｅ」を含むサブグループである。次に、図１８（ｄ）の状態で、部分シーケンス「Ｂ−Ｃ−Ｄ」からなるサブグループの先頭メソッド「Ｂ」が、そのサブグループのルートノードに設定される。また、部分シーケンス「Ｅ」からなるサブグループの先頭メソッド「Ｅ」が、そのサブグループのルートノードに設定される。次に、図１８（ｄ）の状態で、現在のグループの木の末端ノード‘Ｂ’（図１８（ｃ）参照）に、上記２つのサブグループの各ルートノード「Ｂ」と「Ｅ」が子ノードとして登録される。この結果、図１８（ｄ）に示されるように、グループの木は「ＲＯＯＴ−Ａ−Ｂ−（ＢまたはＥ）」となる。そして、図１８（ｄ）の状態で、先頭ノード以外の部分シーケンス「Ｃ−Ｄ」を含むメソッド呼び出しシーケンス部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」が新たなグループとされ、変数Ｎ＝４となる。
【０１０９】
処理が進み、図１８（ｄ）の状態では、Ｎ＝４であるため、ステップＳ１７０２の判定がＹｅｓとなり、再びステップＳ１７０４からＳ１７０７の一連の処理が実行される。図１８（ｄ）の状態から図１８（ｅ）の状態の変化は、次のようになる。まず、図１８（ｄ）の状態の例では、グループ中のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」のＮ＝４番目のメソッド名「Ｃ」を先頭にして、１つのサブグループ「Ｃ−Ｄ」ができる。次に、図１８（ｅ）の状態で、部分シーケンス「Ｃ−Ｄ」からなるサブグループの先頭メソッド「Ｃ」が、そのサブグループのルートノードに設定される。次に、図１８（ｅ）の状態で、現在のグループの木の末端ノードに、上記サブグループのルートノードが子ノードとして登録される。いま、現在のグループの木の末端ノードは、図１８（ｄ）に示されるように、‘Ｂ’または‘Ｅ’の２つがある。これらのうち、上記サブグループの部分シーケンス「Ｃ−Ｄ」が含まれるグループ内のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」において、そのサブグループのルートノード「Ｃ」の１つ親のノード「Ｂ」が選択される。この結果、図１８（ｅ）に示されるように、グループの木は「ＲＯＯＴ−Ａ−Ｂ−（Ｂ−ＣまたはＥ）」となる。そして、図１８（ｅ）の状態で、先頭ノード以外の部分シーケンス「Ｄ」を含むメソッド呼び出しシーケンス部分シーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」が新たなグループとされ、変数Ｎ＝５となる。  さらに処理が進み、図１８（ｅ）の状態では、Ｎ＝５であるため、ステップＳ１７０２の判定がＹｅｓとなり、再びステップＳ１７０４からＳ１７０７の一連の処理が実行される。図１８（ｅ）の状態から図１８（ｆ）の状態の変化は、次のようになる。まず、図１８（ｅ）の状態の例では、グループ中のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」のＮ＝５番目のメソッド名「ｄ」を先頭にして、１つのサブグループ「Ｄ」ができる。次に、図１８（ｆ）の状態で、部分シーケンス「Ｄ」からなるサブグループの先頭メソッド「Ｄ」が、そのサブグループのルートノードに設定される。次に、図１８（ｆ）の状態で、現在のグループの木の末端ノードに、上記サブグループのルートノードが子ノードとして登録される。いま、現在のグループの木の末端ノードは、図１８（ｅ）に示されるように、‘Ｃ’または‘Ｅ’の２つがある。これらのうち、上記サブグループの部分シーケンス「Ｄ」が含まれるグループ内のメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」において、そのサブグループのルートノード「Ｄ」の１つ親のノード「Ｃ」が選択される。この結果、図１８（ｆ）に示されるように、グループの木は「ＲＯＯＴ−Ａ−Ｂ−（Ｂ−Ｃ−ＤまたはＥ）」となる。そして、図１８（ｆ）の状態で、先頭ノード以外の部分シーケンスを含むメソッド呼び出しシーケンス部分シーケンスはもうなくなり、変数Ｎ＝６となる。
【０１１０】
最後に、図１８（ｆ）の状態では、Ｎ＝６＞ＭＡＸＮ＝５となるため、ステップＳ１７０２の判定がＮｏとなる。この結果、図１８（ｆ）で得られている‘ＲＯＯＴ’を始点としたグループの木「ＲＯＯＴ−Ａ−Ｂ−（Ｂ−Ｃ−ＤまたはＥ）」が出力される。これは、図４のメソッドシーケンス表４０１に対応する図５の処理種別分化木５０１の構造に一致する。なお、図５の処理種別分化木５０１では、ルートノードは「Ａ」の１つだけであるためその上位のルートノード‘ＲＯＯＴ’は省略されているが、ルートノードが複数ある場合には、根ノード‘ＲＯＯＴ’が残される。
以上のようにして、図１２のステップＳ２−４において、処理種別分化木５０１が作成される。
【０１１１】
次に、図１２のステップＳ２−７の詳細処理について説明する。ここでは前述したように、図８で説明したように、各モデル番号毎に、メソッド呼び出し回数毎のメソッド開始から完了までの平均の残り時間が計算され、モデル表２０６に登録される。このために、メモリ上に、図１９（ａ）に示されるようなデータ構造を有する平均時間計算用テーブル１９０１が作成される。この平均時間計算用テーブル１９０１の構造は、Ｍｅｔｈｏｄ名と直前モデル番号の項目以外は、図８に示されるモデル表２０６のデータ構造と同じである。すなわち、平均時間計算用テーブル１９０１は、図１２のステップＳ２−６で決定されたモデル番号に対応する行毎に、図４のメソッドシーケンス表４０１中の最長シーケンスに対応するメソッド呼び出し回数分の各項目値を保持する。これらの項目値としては、各モデル番号毎の各メソッド呼び出し回数の残り時間の累算値が登録されてゆく。それらの項目値の初期状態は、図１９（ａ）に示されるように、全て「０」である。残り時間の累算が全て終了した状態では、平均時間計算用テーブル１９０１には、例えば図１９（ｂ）に示されるように、「８５、４５、２０、１０、５」「５０、２０、１５、１０、５」「３５、２５、５、０、０」といった残り時間の累算値が得られる。また、平均時間計算用テーブル１９０１の各行には、累算された回数を示す出現頻度の値が登録される。この初期値は、図１９（ａ）に示されるように、「０」である。累算終了後の図１９（ｂ）の例では、モデル番号１、２、３、４毎の各出現頻度は、例えば「１０」「１０」「５」「５」となる。累算終了時に図１９（ｂ）の例のようにして得られた各モデル番号および各メソッド呼び出し時毎の残り時間の累算値が、各モデル番号毎の出現頻度で除算されることにより各残り時間の平均値が計算される。この結果、前述した図８に例示されるモデル表２０６が得られる。
【０１１２】
図２０は、以上のモデル表２０６の算出処理を示す図１２のＳ２−７の詳細処理を示すフローチャートである。この処理について、図２１および図２２の説明図を用いながら説明する。
【０１１３】
まず、メモリ上に、図１９（ａ）に示される初期状態の平均時間計算用テーブル１９０１が作成される（図２０のステップＳ２００１）。
次に、メモリ上の配列変数Ｓに、図４のようにしてメソッドシーケンス表４０１に得られている各メソッド呼び出しシーケンスの文字列が格納される（図２０のステップＳ２００２）。
【０１１４】
次に、配列変数Ｓが空集合になったか否かが判定される（ステップＳ２００３）。
配列変数Ｓが空集合になっておらずステップＳ２００３の判定がＮｏならば、配列変数Ｓから、１つのメソッド呼び出しシーケンスの文字列が取り出されて、その内容がメモリ上の変数Ａに格納される（ステップＳ２００４）。例えば、配列変数Ｓから、図２１の２１０１で示されるメソッドシーケンス表４０１中のメソッド呼び出しシーケンスの文字列が読み出されて、変数Ａに格納される。
【０１１５】
次に、変数Ａに格納されたメソッド呼び出しシーケンスの文字列が、図１２のステップＳ２−６で決定された処理種別分化木５０１上のモデル番号に照合される。この結果、変数Ａのメソッド呼び出しシーケンスに適合するモデル番号群が探索され、それらの番号列がメモリ上の配列変数Ｍに格納される（図２０のステップＳ２００５）。図２１の例では、メソッド呼び出しシーケンス２１０１で処理種別分化木５０１が照合された結果、モデル番号１、２、３が適合する。
【０１１６】
次に、平均時間計算用テーブル１９０１上で、配列変数Ｍに含まれている各モデル番号に対応する各行の出現頻度項目に、メソッドシーケンス表４０１上の変数Ａのメソッド呼び出しシーケンスに対応する行の出現回数項目の値が加算される。図２１の例では、平均時間計算用テーブル１９０１上の図２１の２１０２として示されるモデル番号１、２、３に対応する各行の各出現頻度項目に、メソッド呼び出しシーケンス２１０１の出現回数＝１が加算される（以上、図２０のステップＳ２００６）。
【０１１７】
そして、平均時間計算用テーブル１９０１上で、配列変数Ｍに含まれている各モデル番号に対応する各行の各メソッド呼び出し回数項目に、次の各値が加算される。メソッドシーケンス表４０１上の変数Ａのメソッド呼び出しシーケンスに対応する行の各メソッド呼出し回数項目の値に、同じ各行の出現回数項目の値がそれぞれ乗算され、各乗算結果が加算される。図２１の例では、メソッドシーケンス表４０１上のメソッド呼び出しシーケンス２１０１に対応する行の各メソッド呼び出し回数項目の値「１０」「４」「３」「２」「１」にそれぞれ出現回数＝１が乗算される。そして、各乗算結果「１０」「４」「３」「２」「１」が、図２１の２１０２として示されるモデル番号１、２、３の各行の各メソッド呼び出し回数項目に加算される。
【０１１８】
その後、ステップＳ２００３に戻り、配列変数Ｓが空集合になったか否かが判定される（ステップＳ２００３）。図４のメソッドシーケンス表４０１の例では、配列変数Ｓには、まだメソッド呼び出しシーケンス「Ａ−Ｂ−Ｅ」が残っている。この結果、ステップＳ２００３の判定がＮｏになり、ステップＳ２００４からＳ２００７の一連の処理が再び実行される。その例は、図２２に示される。例えば、配列変数Ｓから、図２２の２２０１で示されるメソッドシーケンス表４０１中のメソッド呼び出しシーケンスの文字列が読み出されて、変数Ａに格納される。次に、メソッド呼び出しシーケンス２１０１で処理種別分化木５０１が照合された結果、モデル番号１、２、４が適合する。次に、平均時間計算用テーブル１９０１上の図２２の２１０２および２１０３として示されるモデル番号１、２、４に対応する各行の各出現頻度項目に、メソッド呼び出しシーケンス２２０１の出現回数＝１が加算される。次に、メソッドシーケンス表４０１上のメソッド呼び出しシーケンス２２０１に対応する行の各メソッド呼び出し回数項目の値「１」「７」「５」「１」にそれぞれ出現回数＝１が乗算される。そして、各乗算結果「１」「７」「５」「１」が、図２２の２２０２および２２０３として示されるモデル番号１、２、４の各行の各メソッド呼び出し回数項目に加算される。その後、ステップＳ２００３に戻り、配列変数Ｓが空集合になったか否かが判定される。
【０１１９】
図４のメソッドシーケンス表４０１の例では、配列変数Ｓには、メソッド呼び出しシーケンスは残っていないため、ステップＳ２００３の判定は、Ｙｅｓとなる。この結果、平均時間計算用テーブル１９０１上の全てのモデル番号に対応する行について、各メソッド呼び出し回数毎の残り時間の累算値が出現頻度で除算され残り時間の平均値が算出される（ステップＳ２００８）。そして、各残り時間の平均値が、図８のモデル表２０６に反映される（ステップＳ２００９）。図２２の平均時間計算用テーブル１９０１から、図８のモデル表２０６が生成されることになる。
【０１２０】
図２３は、図１２のステップＳ２−８の詳細処理を示すフローチャートである。ここでは、図９で説明したように、メソッド毎に、モデル番号間の遷移関係が取得され、モデル番号遷移表２０７に書き込まれる。  まず、モデル表２０６中の「Ｍｅｔｈｏｄ名」項目から、全てのメソッド名が抽出され、メモリ上の配列変数Ｍに格納される（図２３のステップＳ２３０１）。図８のモデル表２０６の例では、配列変数Ｍに、メソッド名「Ａ」「Ｂ」「Ｅ」が格納される。
【０１２１】
次に、配列変数Ｍから全てのメソッド名が取り出されてその内容が空になったか否かが判定される（図２３のステップＳ２３０２）。
配列変数Ｍにまだメソッド名が残っておりステップＳ２３０２の判定がＮｏならば、配列変数Ｍから１つのメソッド名が取り出され、メモリ上の変数ｍに格納される（図２３のステップＳ２３０３）。図８のモデル表２０６の例では、例えばメソッド名「Ａ」が変数ｍに格納される。
【０１２２】
次に、図８のモデル表２０６において、「Ｍｅｔｈｏｄ名」項目が変数ｍのメソッド名に等しい各行が選択される。そして、選択された各行において、次のような遷移関係のペアが生成される（図２３のステップＳ２３０４）。
（「直前モデル番号」項目の値）→（「モデル番号」項目の値）
例えば、図８のモデル表２０６の例では、「Ｍｅｔｈｏｄ名」項目の値「Ａ」であるモデル番号＝１の行について、「＊→１」というペアが生成される。なお、「＊」はモデル番号が無いことを示している。
【０１２３】
そして、メモリ上にモデル番号遷移表２０７が生成される。次に、変数ｍのメソッド名に対応する行のエントリがなければ、そのエントリが生成されて「メソッド」項目に変数ｍのメソッド名が格納される。そして、その行のエントリの「モデル番号遷移項目」に、ステップＳ２３０４で生成された遷移関係が格納される（以上、図２３のステップＳ２３０５）。図８のモデル表２０６の例において、変数ｍ＝Ａであるとき、図９に示される１行目の行のエントリが生成される。
【０１２４】
その後、ステップＳ２３０２に戻り、配列変数Ｍが空集合か否かが判定される。図８のモデル表２０６の例で、メソッドＡが処理された段階では、配列変数ＭにはまだメソッドＢ、Ｅが残っている。この結果、ステップＳ２３０２の判定がＮｏとなって、ステップＳ２３０３からステップＳ２３０５までの一連の処理が再び実行される。図８のモデル表２０６の例では、例えば２番目のメソッド名「Ｂ」が変数ｍに格納される。次に、「Ｍｅｔｈｏｄ名」項目の値「Ｂ」であるモデル番号＝２、３の各行について、「１→２」および「２→３」という各ペアが生成される。そして、モデル番号遷移表２０７上で、図９に示される２行目の行のエントリが生成される。
【０１２５】
その後、ステップＳ２３０２に戻り、配列変数Ｍが空集合か否かが判定される。図８のモデル表２０６の例で、２番目のメソッドＢが処理された段階では、配列変数ＭにはまだメソッドＥが残っている。この結果、ステップＳ２３０２の判定がＮｏとなって、ステップＳ２３０３からステップＳ２３０５までの一連の処理が再び実行される。図８のモデル表２０６の例では、例えば３番目のメソッド名「Ｅ」が変数ｍに格納される。次に、「Ｍｅｔｈｏｄ名」項目の値「Ｅ」であるモデル番号＝４の行について、「２→４」というペアが生成される。そして、モデル番号遷移表２０７上で、図９に示される３行目の行のエントリが生成される。
【０１２６】
図２４は、第２の実施形態のシステム構成図であり、図１のサーバコンピュータ１０２上で動作する。図２４において、図２の第１の実施形態のシステム構成の場合と同じ番号が付された部分は同じ機能を有する。図２４の第２の実施形態のシステム構成が図２の第１の実施形態のシステム構成と異なる部分は、メソッド呼び出し回数カウントコード挿入部２４０１である。
【０１２７】
メソッド呼び出し回数カウントコード挿入部２４０１は、処理種別を動的に判断するＷｅｂアプリコード２０９に対して、さらに現在実行中のスレッドにおいてメソッド呼び出し回数をカウントするためのコードを挿入する。この結果、残り時間算出が可能なＷｅｂアプリコード２４０２を出力する。
【０１２８】
第１の実施形態において説明したように、各スレッドに対応してメモリ上に確保されるスレッドローカル変数テーブル３０２には、図３に示されるように、第１の実施形態において更新されるＭＯＥＤＬＩＤ変数のほかに、ＮＣＡＬＬ変数も含まれる。メソッド呼び出し回数カウントコード挿入部２４０１は、メソッドが呼び出されるたびに、このＮＣＡＬＬ値をインクリメントするように動作する。
【０１２９】
具体的には、メソッド呼び出し回数カウントコード挿入部２４０１は、処理種別を動的に判断するＷｅｂアプリコード２０９中の各メソッドのプログラムコードの先頭に、ＮＣＡＬＬ値をインクリメントするためのコードを自動生成して埋め込む。
【０１３０】
図２５は、第２の実施形態におけるメソッド呼び出し回数カウントコード挿入部の説明図である。図２５において、例えばメソッドＡのプログラムコード２５０１は、第１の実施形態で生成された処理種別を動的に判断するＷｅｂアプリコード２０９の一部である。メソッド呼び出し回数カウントコード挿入部２４０１は、プログラムコード２５０１において、ＮＣＡＬＬ値をインクリメントするコード「ＮＣＡＬＬ＋＋；」を埋めこむことにより、プログラムコード２５０２に変換する。ここで「ＮＣＡＬＬ＋＋；」は各プログラムコードの先頭に挿入するそのメソッドが呼ばれる回数を表現するが、メソッドのローカル変数ではなく、メソッドのグローバル変数である。このプログラムコード２５０２が、図２４の残り時間算出が可能なＷｅｂアプリコード２４０２として出力される。この残り時間算出が可能なＷｅｂアプリコード２４０２がスレッド上で実行された場合、プログラムコード「ＮＣＡＬＬ＋＋；」により、現在のスレッドに対応する図３のスレッドローカル変数テーブル３０２上のＮＣＡＬＬ値が読み出される。そして、その値が＋１され、その結果がスレッドローカル変数テーブル３０２上のＮＣＡＬＬ値として書き戻される。
【０１３１】
これにより、スレッド上で、メソッドが実行される毎に、スレッドローカル変数テーブル３０２上のＮＣＡＬＬ値がインクリメントされる。
つまり、図２４の第２の実施形態のシステムにおいて、Ｗｅｂアプリコード２０１の代わりに残り時間算出が可能なＷｅｂアプリコード２４０２が実行されることにより、次のような処理が実現される。まず、第１の実施形態と同様に、スレッドローカル変数テーブル３０２上のＭＯＥＤＬＩＤ値として、対応するスレッドにおける現在の処理種別を判別することが可能となる。さらに、スレッドローカル変数テーブル３０２上のＮＣＡＬＬ値として、対応するスレッドにおいて現時点におけるメソッド呼び出し回数を判別することが可能となる。
【０１３２】
このようにして、実行中の各スレッドに対応する図３のスレッドローカル変数テーブル３０２上で、第２の実施形態によりインクリメントされるＮＣＡＬＬ値と、第１の実施形態により更新されるＭＯＥＤＬＩＤ値を用いることにより、スレッドの残り時間の算出が可能となる。
【０１３３】
図２６は、第３の実施形態のシステム構成図である。このシステムは、図１のクライアントコンピュータ１０１からリクエストＩＤを指定して残り時間の問合せ要求に対して、残り時間を応答することができるシステムである。このシステムは、上述の第２の実施形態の処理（第１の実施形態の処理を含む）を利用することにより、残り時間を応答する。
【０１３４】
第３の実施形態のシステムは、図１のサーバコンピュータ１０２上で動作する。
図２６において、ユーザリクエスト処理スレッド２６０２は、ユーザからのリクエストに基づいて、リクエストＩＤ毎にメモリ上に生成されるスレッドである。このユーザリクエスト処理スレッド２６０２上で、図２４の第の２実施形態により生成される残り時間算出が可能なＷｅｂアプリコード２４０２が実行され、そのアプリコードからユーザデータであるＷｅｂサービス処理データ２６０６が参照、更新される。また、ユーザリクエスト処理スレッド２６０２毎に、第１の実施形態において前述した図３のスレッドローカル変数テーブル３０２が確保される。このスレッドローカル変数テーブル３０２は、前述したように、各スレッドのリクエストＩＤとスレッドローカル変数テーブル３０２との対応関係を管理する図３のスレッドローカル変数管理テーブル３０１を介して参照される。このスレッドローカル変数管理テーブル３０１は、全ユーザリクエスト処理スレッド２６０２に対して、１つ設けられる。
【０１３５】
第２の実施形態で説明したように、スレッド上で残り時間算出が可能なＷｅｂアプリコード２４０２が実行されることにより、スレッドローカル変数テーブル３０２上のＭＯＥＤＬＩＤ値とＮＣＡＬＬ値が更新されてゆく。
【０１３６】
図２６において、残り時間算出スレッド２６０１は、ユーザから、現在自分が実行中のユーザリクエスト処理スレッド２６０２に対する残り時間問合せ要求２６０４を受信したときにメモリ上に生成される。この残り時間算出スレッド２６０１は、例えばＪａｖａ言語によるサーブレットプログラムとして実行される。残り時間算出スレッド２６０１は、残り時間問合せ要求２６０４に含まれるリクエストＩＤに基づいて、図３のスレッドローカル変数管理テーブル３０１にアクセスする。これにより、残り時間算出スレッド２６０１は、残り時間問合せ要求２６０４に対応するユーザリクエスト処理スレッド２６０２中のスレッドローカル変数テーブル３０２にアクセスし、残り時間を算出し残り時間応答２６０５としてユーザに応答する。  図２７は、第３の実施形態における残り時間算出スレッドの処理を示すフローチャートである。
【０１３７】
まず、進捗状況が特定される。残り時間問合せ要求２６０４が来たときに、現在進行中のリクエストＩＤに基づいて、ユーザ処理のリクエストが到着してからのメソッドが呼ばれた回数と現在の処理分類（モデル番号）が、スレッドローカル変数テーブル３０２から読み出される（図２７のステップＳ２７０１）。
【０１３８】
次に、残り時間が算出される。残っている処理に関する最近の平均処理時間から、残り処理時間が算出され、ユーザに残り時間応答２６０５が返される（図２７のステップＳ２７０２）。
【０１３９】
図２８は、図２７のステップＳ２７０１の詳細処理を示すフローチャートである。
まず、ユーザから残り時間問合せ要求２６０４を受ける。これには、リクエストＩＤが含まれている（図２８のステップＳ２８０１）。
【０１４０】
次に、リクエストＩＤから、図３のスレッドローカル変数管理テーブル３０１を参照し、リクエストＩＤに対応する図３のスレッドローカル変数テーブル３０２を探す（図２８のステップＳ２８０２）。
次に、リクエストＩＤに対応する図３のスレッドローカル変数テーブル３０２から、ＭＯＥＤＬＩＤ値とＮＣＡＬＬ値を取り出す（図２８のステップＳ２８０３）。
【０１４１】
図２９は、上述のようにしてスレッドローカル変数テーブル３０２から取り出されたＭＯＥＤＬＩＤ値とＮＣＡＬＬ値に基づいて、残り時間を算出する処理の説明図である。図２７のステップＳ２７０２では、第１または第２の実施形態において生成されているモデル表２０６（図２または図２４）において、図２８のステップＳ２８０３で取得されたＭＯＥＤＬＩＤ値とＮＣＡＬＬ値に基づいて次のような参照動作を行う。ＭＯＥＤＬＩＤ値に対応するモデル番号のエントリ行の、ＮＣＡＬＬ値に対応するメソッド呼び出し回数の項目に登録されている残り時間が取得され、図１のクライアントコンピュータ１０１に、残り時間応答２６０５として応答される。例えば、図２９（図８）に例示されるモデル表２０６において、スレッドローカル変数テーブル３０２からＭＯＥＤＬＩＤ値＝４、ＮＣＡＬＬ値＝３が得られたとする。この場合、モデル表２０６上のモデル番号＝４に対応するエントリ行のメソッド呼び出し回数＝３の項目に対応する残り時間＝１秒が取得され、クライアントコンピュータ１０１に応答される。
【０１４２】
以上のようにして、第３の実施形態により、現在実行中のスレッドに対応する処理種別とメソッド呼び出し回数をＭＯＥＤＬＩＤ値およびＮＣＡＬＬ値として自動的に取得し、それらに基づいて適切な残り時間を応答することが可能となる。
【０１４３】
図３０は、第４の実施形態のシステム構成図であり、図１のサーバコンピュータ１０２上で動作する。図３０において、図２４の第２の実施形態のシステム構成の場合と同じ番号が付された部分は同じ機能を有する。図３０の第４の実施形態のシステム構成が図２４の第２の実施形態のシステム構成と異なる部分は、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１である。
【０１４４】
図３に示されるように、スレッドローカル変数管理テーブル３０１から参照される各スレッド毎のスレッドローカル変数テーブル３０２には、ＥＮＤＴＩＭＥ変数とＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数が記録される。ＥＮＤＴＩＭＥ変数は、それが含まれるスレッドローカル変数テーブル３０２に対応するスレッドの実行終了時刻をＥＮＤＴＩＭＥ値として記録する変数である。ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数は、そのスレッド内で実行される一連のメソッドの各実行開始時刻列を記録する配列変数である。
【０１４５】
そして、第４の実施形態におけるメソッド開始時刻／スレッド終了時刻記録コード挿入部３００１は、残り時間更新のためのメソッド起動履歴の保存用コードの注入処理として、次のような処理を実行する。
【０１４６】
まず、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１は、実行開始時刻をスレッドローカル変数テーブル３０２中のＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数に記録するプログラムコードを自動生成する。そして、自動生成したプログラムコードを、メソッド呼び出し回数カウントコード挿入部２４０１が生成した残り時間算出が可能なＷｅｂアプリコード２４０２中の全メソッドのプログラムコードに埋め込む。
【０１４７】
また、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１は、次のような２つのプログラムコードを自動生成する。第１のプログラムコードは、スレッドの実行終了時刻をスレッドローカル変数テーブル３０２中のＥＮＤＴＩＭＥ変数に記録する。第２のプログラムコードは、スレッドローカル変数テーブル３０２に記録されたＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列値とＥＮＤＴＩＭＥ値とから、スレッド内で実行される各メソッド毎の処理の残り時間を算出し、その算出に基づきモデル表２０６を更新する。そして、上記第１、第２のプログラムコードを、メソッド呼び出し回数カウントコード挿入部２４０１が生成した残り時間算出が可能なＷｅｂアプリコード２４０２中のスレッドの実行終了時に最後に実行されるメソッドのプログラムコードに、埋め込む。
【０１４８】
図３１は、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１によって実行される、メソッド開始時刻記録コードの注入処理の説明図である。図３１において、例えばメソッドＡのプログラムコード３１０１は、第２の実施形態で生成された残り時間算出が可能なＷｅｂアプリコード２４０２（図２４、図３０参照）の一部である。
【０１４９】
メソッド開始時刻記録コードの注入処理では、プログラムコード３１０１において、メソッド呼び出しの先頭部分に、コード「Ｔ＝ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）；」と「ｐｕｓｈ（ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ，Ｔ）；」が埋め込まれる。また、メソッドの末尾部分に、コード「Ｔ＝ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）；」と「ＥＮＤＴＩＭＥ＝Ｔ；」が埋め込まれる。なお、コード「ＮＣＡＬＬ＋＋；」は、メソッド呼び出し回数カウントコード挿入部２４０２（図３０）によって挿入されたコードである。これについては、第２の実施形態で説明した（図２５参照）。
【０１５０】
メソッドの先頭部分に埋め込まれるコード「Ｔ＝ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）；」は、例えばメソッドＡの開始時点での現在時刻を算出する関数ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）を実行し、その結果得られる現在時刻をメモリ上の変数Ｔに格納する。また、コード「ｐｕｓｈ（ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ，Ｔ）；」は、現在のスレッドに対応するスレッドローカル変数テーブル３０２中のＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数（図３参照）の末尾に、変数Ｔの値を新たな配列要素として追加する。これらの２つのコードにより、例えばメソッドＡの実行開始時刻が、ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数値として記録される。
【０１５１】
メソッドの末尾部分に埋め込まれるコード「Ｔ＝ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）；」は、例えばメソッドＡの終了時点での現在時刻を算出する関数ｇｅｔ＿ｔｉｍｅｓｔａｍｐ（）を実行し、その結果得られる現在時刻をメモリ上の変数Ｔに格納する。また、コード「ＥＮＤＴＩＭＥ＝Ｔ；」は、現在のスレッドに対応するスレッドローカル変数テーブル３０２中のＥＮＤＴＩＭＥ変数（図３参照）に、変数Ｔの値を格納する。これらの２つのコードにより、例えばメソッドＡの終了時刻＝現時点でのスレッドの終了時刻が、ＥＮＤＴＩＭＥ値として記録される。
【０１５２】
以上のようにして、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１は、例えばメソッドＡのプログラムコード３１０１をプログラムコード３１０２に変換する。そして、このようにして変換して得たプログラムコード３１０２を、新たな残り時間算出が可能なＷｅｂアプリコード３００２（図３０）の一部として出力する。
【０１５３】
図３２は、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１によって実行される、スレッド終了時刻記録コードの注入処理の説明図である。図３２において、例えば図１０と同様の「ｄｏＧｅｔ（）」メソッドのプログラムコード３２０１は、第２の実施形態で生成された残り時間算出が可能なＷｅｂアプリコード２４０２（図２４、図３０参照）の一部である。なお、図１０において説明したように例えば、「ｄｏＧｅｔ（）」メソッドの代わりに「ｄｏＰｏｓｔ（）」メソッドであってもよい。これらのメソッドは、図１０で説明しように、図１のクライアントコンピュータ１０１からリクエストＩＤを有するリクエストが受信されたときに最初に実行されるメソッドである。
【０１５４】
メソッド開始時刻記録コードの注入処理では、プログラムコード３２０１の末尾部分に、スレッドローカル変数テーブル３０２中のＥＮＤＴＩＭＥ変数の値を同じくＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数の新たな要素として追加するコードが埋め込まれる。また、プログラムコード３２０１の末尾部分に、スレッドローカル変数テーブル３０２中のＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列変数の情報をモデル表２０６に反映させる処理を実行するコードが埋め込まれる。
【０１５５】
このようにして、メソッド開始時刻／スレッド終了時刻記録コード挿入部３００１は、例えば「ｄｏＧｅｔ（）」メソッドのプログラムコード３２０１をプログラムコード３２０２に変換する。そして、このようにして変換して得たプログラムコード３２０２を、新たな残り時間算出が可能なＷｅｂアプリコード３００２（図３０）の一部として出力する。
【０１５６】
なお、プログラムコード３２０１の先頭部分に埋め込まれるリクエストＩＤを生成するコードと、スレッドローカル変数領域を確保するコードは、処理種別動的判断コード挿入部２０８（図３０）によって挿入されたコードである。プログラムコード３２０１の末尾部分に埋め込まれるスレッドローカル変数領域を解放するコードも、処理種別動的判断コード挿入部２０８によって挿入されたコードである。これについては、第１の実施形態で説明した（図１０参照）。
【０１５７】
図３３および図３４は、図３２のプログラムコード３２０２によって実行される、ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹの情報をモデル表２０６へ反映させる処理の説明図である。
この処理では、図１９で説明したのと同様のメモリ上に作成される平均時間計算用テーブル１９０１が使用される。まず、例えば図８に示されるようにメモリ上に得られているモデル表２０６の登録内容のうち、各モデル番号の行毎のモデル番号とＭｅｔｈｏｄ名と各メソッド呼び出し回数毎の平均残り時間のデータが、平均時間計算用テーブル１９０１にコピーされる。そして、平均時間計算用テーブル１９０１の各モデル番号に対応する各行の出現頻度項目の値が１にセットされる。
【０１５８】
次に、現在のスレッドでの各メソッドの実行の結果、例えばメソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」が実行されたとする。また、スレッドローカル変数テーブル３０２（図３）中のＭＯＥＤＬＩＤ値は、最後（３番目）に実行された重要呼び出しのモデル番号に対応する値３となったとする。さらに、図３１のプログラムコード３１０２により、スレッドローカル変数テーブル３０２中のＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列値として例えば、「１０００００」「１００００８」「１０００１５」「１０００２３」「１０００２５」が得られたとする。「１０００００」は最初に実行されたメソッドＡの実行開始時刻である。「１００００８」は２番目に実行されたメソッドＢの実行開始時刻である。「１０００１５」は３番目に実行されたメソッドＢの実行開始時刻である。「１０００２３」は４番目に実行されたメソッドＣの実行開始時刻である。「１０００２５」は最後に実行されたメソッドＤの実行開始時刻である。また、図３２のプログラムコード３１０２により、ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹの最後の配列値として例えば、「１０００３０」が得られたとする。この「１０００３０」は、最後にメソッドＤが実行された時点でスレッドローカル変数テーブル３０２中のＥＮＤＴＩＭＥ値として得られた、メソッドＤの実行終了時刻、すなわちスレッドの実行終了時刻である。
【０１５９】
次に、ＭＥＴＨＯＤ＿ＨＩＳＴＯＲＹ配列値として得られたスレッドの終了時刻「１０００３０」から各メソッドの各実行開始時刻「１０００００」「１００００８」「１０００１５」「１０００２３」「１０００２５」が減算される。これにより、各メソッドの実行開始時の残り時間が、「３０」「２２」「１５」「７」「５」秒というように計算される。
【０１６０】
次に、今回実行されたメソッド呼び出しシーケンスの各メソッド名が、例えば図７のようにして得られている処理種別分化木５０１上のモデル番号に照合される。この結果、今回実行されたメソッド呼び出しシーケンスに適合するモデル番号群が探索される。図３４の例では、メソッド呼び出しシーケンス「Ａ−Ｂ−Ｂ−Ｃ−Ｄ」で図７の処理種別分化木５０１上の各モデル番号が照合された結果、モデル番号１、２、３が適合する。
【０１６１】
次に、平均時間計算用テーブル１９０１上で、上記適合した各モデル番号に対応する各行の出現頻度項目の値が＋１ずつインクリメントされる。図３４の例では、平均時間計算用テーブル１９０１上の上記適合したモデル番号１、２、３に対応する各行の各出現頻度項目の値が、全て２になる。
【０１６２】
そして、平均時間計算用テーブル１９０１上で、上記適合した各モデル番号に対応する各行の各メソッド呼び出し回数項目毎の各平均残り時間に、今回計算された各メソッド毎の残り時間が加算される。例えば、モデル番号＝１に対応するメソッド呼び出し回数１〜５に対応する各平均残り時間「８．５」「４．５」「２」「１」「０．５」（図３０）に、今回計算された各メソッド毎の残り時間「３０」「２２」「１５」「７」「５」（図３４）が加算される。この結果、平均時間計算用テーブル１９０１上のモデル番号＝１に対応する各メソッド呼び出し回数項目毎の残り時間加算値は、図３４に例示されるように、「３８．５」「２６．５」「１７」「８」「５．５」となる。モデル番号＝２の場合も、モデル番号＝１の場合と同じ計算結果となる。さらに、モデル番号＝３に対応するメソッド呼び出し回数１〜５に対応する各平均残り時間「１０」「４」「３」「２」「１」（図３０）に、今回計算された各メソッド毎の残り時間「３０」「２２」「１５」「７」「５」（図３４）が加算される。この結果、平均時間計算用テーブル１９０１上のモデル番号＝１に対応する各メソッド呼び出し回数項目毎の残り時間加算値は、図３４に例示されるように、「４０」「２６」「１８」「９」「６」となる。
【０１６３】
このようにして、平均時間計算用テーブル１９０１の内容が更新された後、平均時間計算用テーブル１９０１上の全てのモデル番号に対応する行で、各メソッド呼び出し回数毎の残り時間の累算値が出現頻度で除算され残り時間の平均値が算出される。そして、平均時間計算用テーブル１９０１に得られた各行の各メソッド呼び出し回数毎の残り時間の平均値が、モデル表２０６の各行の各メソッド呼び出し回数項目に書き戻される。
【０１６４】
以上のようにして、第４の実施形態により、新たに実行された各メソッド毎のスレッドの終了までの残り時間の情報を、モデル表２０６に反映させることが可能となる。
【０１６５】
図３５は、上記システムをソフトウェア処理として実現できるコンピュータのハードウェア構成の一例を示す図である。
図３５に示されるコンピュータは、ＣＰＵ３５０１、メモリ３５０２、入力装置３５０３、出力装置３５０４、外部記憶装置３５０５、可搬記録媒体３５０９が挿入される可搬記録媒体駆動装置３５０６、及び通信インタフェース３５０７を有し、これらがバス３５０８によって相互に接続された構成を有する。同図に示される構成は上記システムを実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
【０１６６】
ＣＰＵ３５０１は、当該コンピュータ全体の制御を行う。メモリ３５０２は、プログラムの実行、データ更新等の際に、外部記憶装置３５０５（或いは可搬記録媒体３５０９）に記憶されているプログラム又はデータを一時的に格納するＲＡＭ等のメモリである。ＣＵＰ３５０１は、プログラムをメモリ３５０２に読み出して実行することにより、全体の制御を行う。
【０１６７】
入出力装置３５０３は、ユーザによるキーボードやマウス等による入力操作を検出し、その検出結果をＣＰＵ３５０１に通知し、ＣＰＵ３５０１の制御によって送られてくるデータを表示装置や印刷装置に出力する。
【０１６８】
外部記憶装置３５０５は、例えばハードディスク記憶装置である。主に各種データやプログラムの保存に用いられる。
可搬記録媒体駆動装置３５０６は、光ディスクやＳＤＲＡＭ、コンパクトフラッシュ（登録商標）等の可搬記録媒体３５０９を収容するもので、外部記憶装置３５０５の補助の役割を有する。
通信インタフェース３５０７は、例えばＬＡＮ（ローカルエリアネットワーク）又はＷＡＮ（ワイドエリアネットワーク）の通信回線を接続するための装置である。
【０１６９】
第１〜第４の実施形態によるシステムは、図１２、図１６、図１７、図２０、図２３、図２７、図２８のフローチャート等で実現される機能を搭載したプログラムをＣＰＵ３５０１が実行することで実現される。そのプログラムは、例えば外部記憶装置３５０５や可搬記録媒体３４０９に記録して配布してもよく、或いはネットワーク接続装置３５０７によりネットワークから取得できるようにしてもよい。
【０１７０】
以上の第１〜第４の実施形態に関して、更に以下の付記を開示する。
（付記１）
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入する、
ことを特徴とするアプリケーションコードの変換方法。
（付記２）
前記アプリケーションコードの実行履歴から前記リクエスト毎の前記メソッドの呼び出しの一連のシーケンスを分類したメソッド呼び出しシーケンスを取得し、
前記各メソッド呼び出しシーケンス同士で呼び出し回数毎のメソッド呼び出しを比較し、前記各メソッド呼び出しシーケンスの先頭のメソッドの呼び出しから順に、共通なメソッドの呼び出しをノードとしてまとめ、その後、共通でないメソッドの呼び出しをノードにし、木構造データである処理種別分化木を作成し、
前記処理種別分化木を構成する各ノードのうち分岐したノードを前記アプリケーションコードの処理種別を確定する重要呼び出しとしてマークした後、前記マークした各重要呼び出しから前記処理種別分化木に沿って開始ノード方向に向かって前記各ノードをトラバースし、前記重要呼び出しと同じメソッドのノードと前記開始ノードについても重要呼び出しとしてさらにマークし、
前記アプリケーションコードに前記コードを挿入することにより前記重要呼び出しに基づいて前記処理種別の判断を行う、
ことを特徴とする付記１に記載のコード変換方法。
(付記３)
現在のメソッド呼び出し回数を判別するコードを前記アプリケーションコードに挿入する、
ことを特徴とする付記1または２記載のコード変換方法。
（付記４）
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入し、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付け、
現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込み、
前記識別情報毎に前記メソッド呼び出し回数と前記メソッドの残時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する、
ことを特徴とするリクエストの残り時間応答方法。
(付記５)
前記リクエスト毎に実行履歴を取得し、
前記残時間として前記リクエスト毎にメソッド開始からそのメソッドを含むスレッドの完了するまでの時間を求め、
前記呼び出し順序パターンに対応したメソッド呼び出しシーケンスの出現回数をカウントし、前記残時間の平均時間を求め、
前記メソッド呼び出しシーケンスに基づいて処理種別分化木を作成し、
前記処理種別分化木において処理種別を確定するメソッド呼び出しを重要呼び出しとしてマークしたのち、メソッド呼び出しシーケンスを呼び出し元方向にトラバースし同じメソッドについても重要呼び出しとし、
前記処理種別分化木の重要呼び出しに前記識別情報に対応するモデル番号を付し、前記平均時間をモデル表へ登録し、
前記処理種別分化木に基づいて前記メソッド毎にモデル番号遷移表を作成し、
前記モデル番号遷移表に基づいて前記コードとして処理種別判別コードを前記アプリケーションコードに挿入し、
メソッド呼び出し回数をカウントするコードを前記アプリケーションコードに挿入し、
前記処理種別と、前記メソッド呼び出し回数とに基づいて前記モデル表の前記平均時間から各処理種別毎の残時間を求める、
ことを特徴とする付記４記載のリクエストの残り時間応答方法。
（付記６）
前記アプリケーションプログラムに、前記メソッドの実行開始時刻と実行終了時刻を更新して記録するコードを自動生成して埋め込む、
ことを特徴とする付記４または５のいずれかに記載のリクエストの残り時間応答方法。
（付記７）
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出する検出手段と、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入するコード挿入手段と、
を具備することを特徴とするコード変換装置。
（付記８）
コンピュータに、
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入する
処理を実行させることを特徴とするコード変換プログラム。
（付記９）
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出する手段と、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成する手段と、
生成した該コードを前記アプリケーションコードに挿入する手段と、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付ける手段と、
実行中のスレッドにおける現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込む埋め込み手段と、
前記識別情報毎に前記メソッド呼び出し回数と処理時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する応答手段と、
を特徴とするリクエストの残り時間応答装置。
（付記１０）
コンピュータに、
リクエストに応じて実行されるアプリケーションコードに含まれるメソッドが、リクエストに応じて実行される一連のアプリケーションコードに含まれる各メソッドの呼び出し順序パターン上のどのメソッドに対応するか検出し、
検出された該呼び出し順序パターン上の該メソッドに対応する識別情報に基づいてコードを生成し、
生成した該コードを前記アプリケーションコードに挿入し、
実行中のスレッドの処理の残り時間の問い合わせ要求を受け付け、
実行中のスレッドにおける現在のメソッド呼び出し回数を判別するコードを自動生成して前記アプリケーションプログラムに埋め込み、
前記識別情報毎に前記メソッド呼び出し回数と処理時間との関係を見積もった結果に基づいて、処理の残り時間を取得し前記問い合わせ要求に応答する処理を実行する、
ことを特徴とするリクエストの残り時間応答プログラム。
【符号の説明】
【０１７１】
１０１  クライアントコンピュータ
１０２  サーバコンピュータ
２０１  アプリコード
２０２  実行履歴取得コード変換部
２０３  実行履歴取得WEBアプリコード
２０４  実行履歴
２０５  履歴解析部
２０６  モデル表
２０７  モデル番号遷移表
２０８  処理種別動的判別コード挿入部
２０９  処理種別を動的に判断するWEBアプリコード
【図３１】
0005644642.tif 000002
【図１】
0005644642.tif 000003
【図２】
0005644642.tif 000004
【図３】
0005644642.tif 000005
【図４】
0005644642.tif 000006
【図５】
0005644642.tif 000007
【図６】
0005644642.tif 000008
【図７】
0005644642.tif 000009
【図８】
0005644642.tif 000010
【図９】
0005644642.tif 000011
【図１０】
0005644642.tif 000012
【図１１】
0005644642.tif 000013
【図１２】
0005644642.tif 000014
【図１３】
0005644642.tif 000015
【図１４】
0005644642.tif 000016
【図１５】
0005644642.tif 000017
【図１６】
0005644642.tif 000018
【図１７】
0005644642.tif 000019
【図１８】
0005644642.tif 000020
【図１９】
0005644642.tif 000021
【図２０】
0005644642.tif 000022
【図２１】
0005644642.tif 000023
【図２２】
0005644642.tif 000024
【図２３】
0005644642.tif 000025
【図２４】
0005644642.tif 000026
【図２５】
0005644642.tif 000027
【図２６】
0005644642.tif 000028
【図２７】
0005644642.tif 000029
【図２８】
0005644642.tif 000030
【図２９】
0005644642.tif 000031
【図３０】
0005644642.tif 000032
【図３２】
0005644642.tif 000033
【図３３】
0005644642.tif 000034
【図３４】
0005644642.tif 000035
【図３５】
0005644642.tif 000036