(57)【要約】【課題】自動でのプログラム分割を実現し、プログラムの実行時間短縮を支援する。【解決手段】ユーザインタフェース処理部１０は、実行時間を短縮する対象となるプログラムを指定するユーザの入力を検出する。データ処理部３０は、データ保持部２０に保持された閾値に基づいて、当該プログラムを複数の分割プログラムに分割し、各分割プログラムの実行時間を取得する。続いて、データ処理部３０は、分割プログラム間の順序規則の有無に応じて、各分割プログラムを順次実行または並行実行させるように設定し、各分割プログラムの一連の実行における実行時間を示す予測実行時間を算出する。他の分割プログラムとの間に順序規則を有しない分割プログラムを他の分割プログラムと並行実行させるように設定することで、プログラムの実行時間の短縮を実現する。【選択図】図１
2009187331.tif 000002
【特許請求の範囲】
【請求項１】
実行時間を短縮させる対象となるソースプログラムを指定するユーザの入力を検出する要求検出部と、
前記指定されたソースプログラムを取得するソースプログラム取得部と、
前記取得されたソースプログラムを複数のブロックに分割して、前記複数のブロックそれぞれの実行時間を取得する実行時間取得部と、
前記ソースプログラムを１以上のブロックに分割し、複数の分割プログラムを生成する分割プログラム生成部と、
前記複数の分割プログラムそれぞれに含まれる変数の参照関係に応じて、一の分割プログラムの実行前に別の分割プログラムを実行すべき順序規則の有無を判定する順序規則判定部と、
前記順序規則を有する分割プログラムについては、その分割プログラムの実行の前提となる別の分割プログラムの実行後に順次実行させるように設定し、前記順序規則を有しない分割プログラムについては、他の分割プログラムと並行実行させるように設定して、各分割プログラムの一連の実行における予測実行時間を算出する予測実行時間算出部と、
前記算出された予測実行時間を出力する結果出力部と、
を備えることを特徴とするプログラム分割装置。
【請求項２】
前記実行時間取得部は、所定の割合以上の前記分割プログラムが順序規則を有するとき、前記ソースプログラムを前記複数のブロックとは異なるブロックに再分割することを特徴とする請求項１に記載のプログラム分割装置。
【請求項３】
前記実行時間取得部は、所定の割合以上の前記分割プログラムが順序規則を有するとき、前記複数のブロックをさらに小さなブロックに分割することを特徴とする請求項１に記載のプログラム分割装置。
【請求項４】
前記実行時間取得部は、前記複数のブロックいずれの実行時間も第１の閾値以下となるように、前記ソースプログラムを複数のブロックに分割し、
前記分割プログラム生成部は、２以上のブロックの合計実行時間が第２の閾値以下となるとき、前記ソースプログラムにおける前記２以上のブロックを１つの分割プログラムとして生成することを特徴とする請求項１から３のいずれかに記載のプログラム分割装置。
【請求項５】
前記第１および第２の閾値の双方または一方を調整する閾値調整部をさらに備え、
前記閾値調整部は、調整前の閾値に基づき算出された予測実行時間と調整後の閾値に基づき算出された予測実行時間とを比較し、予測実行時間が小さい方の閾値および予測実行時間を保存して、前記調整を繰り返すことを特徴とする請求項４に記載のプログラム分割装置。
【請求項６】
前記要求検出部は、実行時間を短縮させる目標となる目標短縮率を指定するユーザの入力をさらに検出し、
前記閾値調整部は、前記ソースプログラムの実行時間に対する前記予測実行時間の短縮割合が前記目標短縮率以上となるとき、前記第１および第２の閾値を確定させることを特徴とする請求項５に記載のプログラム分割装置。
【請求項７】
前記複数の分割プログラムそれぞれに含まれる変数の参照関係を特定し、各分割プログラムの実行において必要な変数にアクセスできるように、各分割プログラムの入出力インタフェースを決定するインタフェース調整部をさらに備え、
前記結果出力部は、前記決定された入出力インタフェースを有する分割プログラムをさらに出力することを特徴とする請求項１から６のいずれかに記載のプログラム分割装置。
【請求項８】
実行時間を短縮させる対象となるソースプログラムを指定するユーザの入力を検出する機能と、
前記指定されたソースプログラムを取得する機能と、
前記取得されたソースプログラムを複数のブロックに分割して、前記複数のブロックそれぞれの実行時間を取得する機能と、
前記ソースプログラムを１以上のブロックに分割し、複数の分割プログラムを生成する機能と、
前記複数の分割プログラムそれぞれに含まれる変数の参照関係に応じて、一の分割プログラムの実行前に別の分割プログラムを実行すべき順序規則の有無を判定する機能と、
前記順序規則を有する分割プログラムについては、その分割プログラムの実行の前提となる別の分割プログラムの実行後に順次実行させるように設定し、前記順序規則を有しない分割プログラムについては、他の分割プログラムと並行実行させるように設定して、各分割プログラムの一連の実行における予測実行時間を算出する機能と、
前記算出された予測実行時間を出力する機能と、
をコンピュータに実現させることを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、データ処理技術に関し、特にコンピュータプログラムを分割する技術に関する。
【背景技術】
【０００２】
ＩＴ化の進展に伴い、システム開発において製造されるコンピュータプログラム（以下、単に「プログラム」と呼ぶ。）は複雑化・大規模化の一途をたどっている。大規模化したプログラムは、一般的には、生産性・保守性・再利用性等の観点から複数のプログラムに分割されて製造される。
【特許文献１】特開２００２−０７３３３４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、ユーザがシステムに要求する事項の中では、システムの実行性能、具体的にはスループットやレスポンスタイムに対する優先順位が高いことも多い。生産性・保守性・再利用性等に基づき分割されたプログラムは、必ずしもユーザの性能要求を充足するものではないため、システム開発者は、性能を向上させるためのプログラムの変更、いわゆる性能チューニングを手作業により実施することがある。性能チューニングにおいては、プログラムに記述された計算アルゴリズムや命令文の置き換え等が一般的に行われる。
【０００４】
このようにプログラムの実行性能が重視される背景を踏まえ、プログラムをより細分化した複数のプログラム（以下、「分割プログラム」と呼ぶ。）に分割し、分割プログラムを並行実行させることにより、プログラムの実行時間を短縮できると本発明者は考えた。また、分割プログラムの生成および短縮された実行時間の算出を自動化することで、システム開発者の負担を低減できると本発明者は考えた。
【０００５】
本発明は、本発明者の上記着目に基づいて完成された発明であり、その主たる目的は、自動でのプログラム分割を実現し、プログラムの実行時間短縮を支援する技術を提供することである。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、本発明のある態様のプログラム分割装置は、実行時間を短縮させる対象となるソースプログラムを指定するユーザの入力を検出する要求検出部と、指定されたソースプログラムを取得するソースプログラム取得部と、取得されたソースプログラムを複数のブロックに分割して、複数のブロックそれぞれの実行時間を取得する実行時間取得部と、ソースプログラムを１以上のブロックに分割し、複数の分割プログラムを生成する分割プログラム生成部と、複数の分割プログラムそれぞれに含まれる変数の参照関係に応じて、一の分割プログラムの実行前に別の分割プログラムを実行すべき順序規則の有無を判定する順序規則判定部と、順序規則を有する分割プログラムについては、その分割プログラムの実行の前提となる別の分割プログラムの実行後に順次実行させるように設定し、順序規則を有しない分割プログラムについては、他の分割プログラムと並行実行させるように設定して、各分割プログラムの一連の実行における予測実行時間を算出する予測実行時間算出部と、算出された予測実行時間を出力する結果出力部と、を備える。
【０００７】
なお、以上の構成要素の任意の組合せ、本発明の表現を装置、方法、システム、プログラム、プログラムを格納した記録媒体などの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【０００８】
本発明によれば、自動でのプログラム分割を実現し、プログラムの実行時間短縮を支援できる。
【発明を実施するための最良の形態】
【０００９】
本発明の典型的な実施形態は、ソースプログラムから複数の分割プログラムを生成するプログラム分割装置である。このプログラム分割装置は、分割プログラム間の順序規則に応じて、並行実行が可能な分割プログラムについては他の分割プログラムと並行実行させるように設定する。さらに、このプログラム分割装置は、分割プログラムの一連の実行における実行時間を予測し、予測実行時間として出力する。
【００１０】
図１は、本発明の実施の形態におけるプログラム分割装置の機能構成を示すブロック図である。本明細書のブロック図において示される各ブロックは、ハードウェア的には、コンピュータのＣＰＵをはじめとする素子や機械装置で実現でき、ソフトウェア的にはコンピュータプログラム等によって実現されるが、ここでは、それらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックはハードウェア、ソフトウェアの組合せによっていろいろなかたちで実現できることは、当業者には理解されるところである。
【００１１】
プログラム分割装置１００は、ユーザインタフェース処理部１０と、データ保持部２０と、データ処理部３０とを備える。
ユーザインタフェース処理部１０は、プログラマ等システム開発者に対するユーザインタフェース処理を担当する。データ保持部２０は、各種データを保持するための記憶領域である。データ処理部３０は、ユーザインタフェース処理部１０やデータ保持部２０から取得されたデータをもとに各種データ処理を実行する。データ処理部３０は、ユーザインタフェース処理部１０とデータ保持部２０との間のインタフェースの役割も果たす。
【００１２】
ここで、プログラム分割装置１００における処理の概要を説明する。ユーザインタフェース処理部１０は、実行時間を短縮する対象となるソースプログラムを指定するユーザの入力を検出する。データ処理部３０は、データ保持部２０に保持された閾値に基づいて、ソースプログラムを複数の分割プログラムに分割し、各分割プログラムの実行時間を取得する。続いて、データ処理部３０は、分割プログラム間の順序規則の有無に応じて、各分割プログラムを順次実行または並行実行させるように設定し、各分割プログラムの一連の実行における予測実行時間を算出する。他の分割プログラムとの間に順序規則を有しない分割プログラムを他の分割プログラムと並行実行させることにより、プログラムの実行時間の短縮を実現する。
【００１３】
ユーザインタフェース処理部１０：
ユーザインタフェース処理部１０は、要求検出部１２と結果出力部１４とを有する。
【００１４】
要求検出部１２は、実行時間を短縮させる対象となるソースプログラムと、実行時間を短縮する際の目標となる目標短縮率とを指定するユーザの入力を検出する。要求検出部は、典型的には、ソースプログラムおよび目標短縮率を指定入力可能なユーザインタフェース画面をユーザ端末上に表示させる。要求検出部１２はウェブサーバの機能を有してもよく、通信ネットワークを介して、遠隔地のユーザからの指定入力を受け付けてもよい。
結果出力部１４は、複数の分割プログラムおよび予測実行時間を出力する。典型的には、各分割プログラムをファイルとして出力し、予測実行時間をユーザインタフェース画面に表示させる。通信ネットワークを介して、当該データを遠隔地のユーザ端末に送信してもよい。
【００１５】
データ保持部２０：
データ保持部２０は、閾値情報保持部２２を有する。
閾値情報保持部２２は、ソースプログラムを複数のブロックに分割する際に参照される分割閾値と、複数のブロックを統合して１以上の分割プログラムを生成する際に参照される統合閾値とを示す閾値情報を保持する。図２は、閾値情報のデータ構造を示す。閾値欄１０２には、閾値名が記録される。閾値データ欄１０４には、各閾値の値が記録される。
【００１６】
図２での分割閾値の値は３５％である。これは、ソースプログラムを分割したブロックの実行時間（以下、「ブロック実行時間」と呼ぶ。）いずれもが、分割前のソースプログラム全体の実行時間（以下、「分割前実行時間」と呼ぶ。）の３５％以内となるように規定するものである。また同図での統合閾値の値は３０％である。これは、１以上のブロックから生成される分割プログラムの実行時間いずれもが、分割前実行時間の３０％となるように規定するものである。なお、分割閾値および統合閾値の閾値データは、プログラム分割装置１００を使用するシステム開発者等の経験に基づいて決定されてもよく、実験により適切な閾値データが決定されてもよい。または、ユーザが指定した目標短縮率が後述する閾値調整部４４により設定されてもよい。図１に戻る。
【００１７】
データ処理部３０：
データ処理部３０は、ソースプログラム取得部３２と、ソースプログラム分割部３４と、実行時間取得部３６と、分割プログラム生成部３８と、順序規則判定部４０と、予測実行時間算出部４２と、閾値調整部４４と、インタフェース調整部４６とを有する。
【００１８】
ソースプログラム取得部３２は、実行時間を短縮させる対象としてユーザにより指定されたソースプログラムを取得する。本実施の形態の例示では、後述する図３で示す「Module MainProgram」が実行時間を短縮させる対象としてユーザにより指定され、ソースプログラム取得部３２により取得されたこととして説明する。
【００１９】
図３は、実行時間を短縮させる対象となるソースプログラムを示す。「Module MainProgram」（以下、「メインルーチン」とも呼ぶ。）は、プログラムコードのひとかたまりを示すコードブロック１１２、１１４および１１６を含む。これらのコードブロックは、それぞれ「Module Logger」と「Module Estimate」と「Module CreditInquiry」として示される３つのサブルーチンを呼び出す。具体的には、各サブルーチンをインスタンス化して、各インスタンスの有する関数を呼び出している。図３に示すように、「Module_MainProgram」は、１つの呼び出しスレッドから呼び出され、コードブロック１１２、１１４および１１６は順次実行される。図１に戻る。
【００２０】
ソースプログラム分割部３４は、ソースプログラム取得部３２により取得されたソースプログラムを複数のブロックに分割する。ここでの分割は、各ブロックの境界が明確化されればよく、ソースプログラムが複数ファイルに物理的に分割されなくてもよい。例えば、ソースプログラム分割部３４は、各ブロックの境界にブレークポイントを挿入してもよく、タイムスタンプをログ出力するためのプログラムコードを各ブロックの境界に挿入してもよい。
【００２１】
ソースプログラム分割部３４は、まず、ソースプログラムを比較的大きなブロックに分割し、後述する他の部材からの要求に応じて、より小さなブロックに分割していく。ソースプログラム分割部３４がソースプログラムを分割する単位は、例えば、大きい方から、サブルーチン単位・ファンクション単位・命令文単位等である。サブルーチンとは、メインルーチンから呼ばれる関数全体を意味し、図２では「Module Logger」・「Module Estimate」・「Module CreditInquiry」が相当する。ファンクションとは、プログラム内のプライベート関数や、繰り返しブロック、典型的にはＦｏｒブロックや、条件分岐ブロック、典型的にはＩＦブロック等を意味する。命令文とはプログラムの中の一文を意味する。
【００２２】
サブルーチンに基づきソースプログラムを分割するとき、ソースプログラム分割部３４は、例えば、「//」や「%*」等のあとに記述されるコメント文の記載に基づいてサブルーチン単位を認識してもよい。つまり、ソースプログラム分割部３４は、「○○サブルーチン呼び出し」等、特定の文字列を含むコメント文を検出したとき、当該コメント文が分割の境界であると認識してもよい。また、特定のサブルーチンの識別子が記載された範囲、例えば、サブルーチンのインスタンス化処理や関数呼び出し処理が記述された範囲をブロックの範囲として分割の境界を認識してもよい。図１に戻る。
【００２３】
実行時間取得部３６は、ソースプログラム分割部３４により特定された各ブロックのブロック実行時間を取得する。例えば、ブレークポイントやログ出力用のプログラムコードが挿入されたソースプログラムを実行させて、その実行により生成されるログファイル等に出力されたタイムスタンプからブロック実行時間を算出する。なお、必要に応じて、実行時間取得部３６は、ソースプログラムをコンパイルして一旦オブジェクトプログラムを生成し、当該オブジェクトプログラムを実行させてもよい。
【００２４】
なお、ソースプログラムにブレークポイントが挿入される場合には、一般的にデバッグモードでの実行となり、本番環境での実行時間とは異なることが多い。以降の説明では、デバッグモードでの実行時間と本番環境での実行時間を特に区別しない。しかし例えば、本番環境の実行時間をあらかじめ取得しておき、実行時間取得部３６は、本番環境での実行時間とデバッグモードでの実行時間との比率から、デバッグモードでの実行時間を本番環境での実行時間に変換してもよい。例えば、本番環境の実行時間に対する短縮時間そのものを短縮目標としてユーザが指定する場合、この変換は特に有益である。
【００２５】
また、実行時間取得部３６は、いずれかのブロック実行時間の分割前実行時間に対する割合が分割閾値より大きいとき、ソースプログラム分割部３４に当該ブロックをさらに小さなブロックに分割させる。図２で示す分割閾値が「３５％」、分割前実行時間が１．２ミリ秒の場合、実行時間取得部３６は、いずれかのブロック実行時間が０．４２ミリ秒より大きいか否かを判定する。
【００２６】
ここで、ソースプログラム分割部３４および実行時間取得部３６の処理の具体例を示す。まず、ソースプログラム分割部３４は、指定されたソースプログラム、ここでは「Module MainProgram」のサブルーチン単位にソースプログラムを分割する。具体的に図３の「Module MainProgram」の場合、ソースプログラム分割部３４は、コードブロック１１２、１１４および１１６をサブルーチン単位のブロックとして認識し、各コードブロック間にログ出力用のプログラムコードを挿入する。
【００２７】
続いて、実行時間取得部３６は、ログ出力用のプログラムコードを挿入されたソースプログラムを実行させ、ログファイルに出力されたタイムスタンプからコードブロック１１２、１１４および１１６の実行時間を算出する。図４は、図３のコードブロックに対応するサブルーチンの実行時間を示す。同図において、「Module Logger」、「Module Estimate」および「Module CreditInquiry」の実行時間は、それぞれ図３のコードブロック１１２、１１４および１１６の実行時間を示している。ここで、分割前実行時間は「１．２ミリ秒」であり、分割閾値は図２の３５％である。したがって、「Module CreditInquiry」のブロック実行時間「０．６ミリ秒」は分割閾値を上回っているため、実行時間取得部３６は、ソースプログラム分割部３４に「Module CreditInquiry」をより細かく再分割するよう要求する。
【００２８】
ソースプログラム分割部３４は、上述した再分割の要求を受け付け、「Module CreditInquiry」を今度は命令文単位で分割する。図５は、図４のサブルーチンがさらに分割された場合の実行時間を示す。同図は、「Module CreditInquiry」が命令文単位で分割され、コードブロック１２２、１２４および１２６が生成された状態を示している。この場合、ブロック実行時間の分割前実行時間に対する割合は、いずれも分割閾値以下となるため、実行時間取得部３６は、後述する分割プログラム生成の処理に進ませる。図１に戻る。
【００２９】
分割プログラム生成部３８は、ソースプログラムを１以上のブロックに分割して、複数の分割プログラムを生成する。ここでは、ソースプログラム分割部３４により生成された複数のブロックに基づき、統合閾値を参照して統合が可能な２以上のブロックは１つの分割プログラムとして統合しながら、１以上の分割プログラムを生成する。他のブロック統合できないブロックについては、そのまま分割プログラムとして生成する。
【００３０】
分割プログラム生成部３８は、２以上のブロックの実行時間を合算したブロック実行時間の分割前実行時間に対する割合が統合閾値以下であるとき、当該２以上のブロックを１つの分割プログラムに統合する。例えば、図５において、コードブロック１２４および１２６のブロック実行時間の合計は「０．３ミリ秒」であり、分割前実行時間に対する割合が統合閾値以下である。したがって、分割プログラム生成部３８は、コードブロック１２４および１２６を統合して１つの分割プログラムを生成する。なお、分割プログラム生成部３８により生成される分割プログラムは、メモリ上にその内容が記憶されてもよく、磁気記憶装置上に物理的なファイルとしてその内容が記憶されてもよい。
【００３１】
図６（ａ）は、サブルーチン階層における分割プログラムを示す。同図において、図３の「Module Logger」および「Module Estimate」は、そのまま分割プログラムとされている。また、図３の「Module_CreditInquiry」からは、図５のコードブロック１２２に対応する「Module CreditInquiry_1」と、図５のコードブロック１２４および１２６に対応する「Module_CreditInquiry_2」とが分割プログラムとして生成されている。また、「Module CreditInquiry_1」および「Module CreditInquiry_2」の生成時点では、当該モジュールの処理において必要な情報が不明であるため、当該モジュールの関数の引数にはダミー値が設定されている。
【００３２】
また、サブルーチン階層における分割プログラムの生成に併せて、分割プログラム生成部３８は、当該サブルーチンを呼び出すメインルーチン、つまり「Module MainProgram」の分割プログラムも生成する。図６（ｂ）は、メインルーチンの分割プログラムを示す。同図では、図３の「Module MainProgram」から、サブルーチン階層の４つの分割プログラムをそれぞれ呼び出す分割プログラムが生成された状態を示している。同図においても、図６（ａ）と同様に、新規の分割プログラムの引数にはダミー値が設定されている。図１に戻る。
【００３３】
順序規則判定部４０は、複数の分割プログラムそれぞれに含まれる変数の参照関係に応じて、順序規則、つまり一の分割プログラムの実行前に別の分割プログラムを実行すべき規則の有無を判定する。具体的に、まず、順序規則判定部４０は、分割プログラムに記述されたプログラミング言語を処理するコンパイラ等に実装されている既知の字句解析技術・構文解析技術・意味解析技術を使用して、各分割プログラムに含まれる変数の識別子を特定する。続いて、文字列検索等により各識別子の存在箇所を特定することにより、各変数が生成される分割プログラムおよび各変数が参照される分割プログラムを特定する。
【００３４】
図７は、図６（ｂ）の各分割プログラムに含まれる変数の参照関係を示す。モジュール欄１３２には、各分割プログラムの識別情報が記録される。現在日時欄１３４、見積もり結果欄１３６および信用調査要求電文欄１３８には、各分割プログラムに含まれる変数の参照関係が記録される。具体的には、各変数を生成し、または参照する分割プログラムが記録される。例えば、変数「現在日時」は、「Module MainProgram_1」の中で生成され参照されていることを示し、変数「見積もり結果」は、「Module MainProgram_2」の中で生成され、「Module MainProgram_3」の中で参照されることを示している。
【００３５】
ある変数を参照するモジュールは、当該変数を生成するモジュールのあとで実行する必要があるため、順序規則判定部４０は、図７で示す参照関係から順序規則を判定できる。すなわち、「Module MainProgram_1」は、他の分割プログラムと順序規則を有しないと判定する。また、「Module MainProgram_2」、「Module MainProgram_3」および「Module MainProgram_4」は、この順序で実行させるべき順序規則を有していると判定する。
【００３６】
また、順序規則判定部４０は、複数の分割プログラムのうち、所定の割合以上の分割プログラムが順序規則を有するとき、ソースプログラム分割部３４にソースプログラムを異なるブロックに再分割するよう要求する。または、各ブロックをさらに小さなブロックに分割するように要求する。所定の割合以上の分割プログラムが順序規則を有するときとは、いずれかの分割プログラムが順序規則を有するときでもよく、全ての分割プログラムが順序規則を有するときでもよく、５０％以上の分割プログラムが順序規則を有するときでもよい。多くの分割プログラムがそれぞれに順序規則を有する場合、それらの分割プログラムは順次実行される必要があり、その結果、並行実行により分割前実行時間を短縮できる効果が小さくなるからである。
【００３７】
ソースプログラムを異なるブロックに分割させる結果、分割プログラム生成部３８により異なる分割プログラムが生成され、順序規則を有する分割プログラムの数が減少する可能性がある。また、各ブロックをさらに小さなブロックに分割させる結果、分割プログラム生成部３８によりさらに小さな分割プログラムが生成され、順序規則を有しない分割プログラムの数が通常増加する。順序規則判定部４０は、ソースプログラム分割部３４に上記要求をする際に、閾値情報保持部２２にアクセスして、分割閾値および／または統合閾値を変更、典型的にはより小さくしてもよい。図１に戻る。
【００３８】
予測実行時間算出部４２は、まず、各分割プログラムの実行態様を設定する。すなわち、順序規則を有する分割プログラムについては、その分割プログラムの実行の前提となる別の分割プログラムの実行後に順次実行させるように設定する。また、順序規則を有しない分割プログラムについては、他の分割プログラムと並行実行させるように設定する。続いて、予測実行時間算出部４２は、実行時間取得部３６により取得されたブロック実行時間をもとに、各分割プログラムの一連の実行における予測実行時間を算出する。なお、各分割プログラムをそれぞれの実行態様にしたがって実際に実行させ、各分割プログラムの一連の実行における実行時間を取得してもよい。
【００３９】
図８は、予測実行時間の算出を模式的に示す。順序規則判定部４０において判定されたように、分割プログラム「Module MainProgram_1」と他の分割プログラムとは順序規則を有しない。したがって、予測実行時間算出部４２は、分割プログラム「Module MainProgram_1」については他の分割プログラムと並行実行させるように設定する。一方で、「Module MainProgram_2」、「Module MainProgram_3」および「Module MainProgram_4」は、この順序で実行させるべき順序規則を有している。したがって、予測実行時間算出部４２は、これらの分割プログラムを順次実行させるように設定する。図８で示すように、これらの実行態様が設定された場合、予測実行時間は０．８ミリ秒と算出される。つまり、分割前実行時間が１．２ミリ秒であったのに対し、ソースプログラムを分割し、各分割プログラムのうち可能なものは並行実行させることで、０．４ミリ秒の実行時間短縮が実現されることになる。図１に戻る。
【００４０】
閾値調整部４４は、図２で示す分割閾値および統合閾値の双方または一方を調整する。まず、閾値調整部４４は、調整前の閾値に基づき算出された予測実行時間と調整後の閾値に基づき算出された予測実行時間とを比較する。続いて、閾値調整部４４は、次の比較対象とするために、予測実行時間が小さい方の閾値および予測実行時間を保存して、分割閾値および／または統合閾値の調整を繰り返す。この繰り返しにより、両閾値の様々な組み合わせの中から、予測実行時間が小さくなる閾値の値を特定する。
【００４１】
また、閾値調整部４４は、予測実行時間の分割前実行時間に対する短縮割合がユーザにより指定された目標短縮率を達成しているか否かを判定する。目標短縮率に未達である場合、閾値調整部４４は、分割閾値および統合閾値の双方または一方を調整する。この場合、典型的には、分割閾値および統合閾値を小さくすることで、小さな分割プログラムを生成させるようにする。既述したように、分割プログラムの粒度が小さくなることで、順序規則を有しない分割プログラムが増加し、並行実行可能な分割プログラム数が増加するからである。
【００４２】
目標短縮率を達成している場合、閾値調整部４４は、そのときの分割閾値および統合閾値の閾値データを確定し、後述するインタフェース調整部４６に各分割プログラムのインタフェースを調整させる。なお、この場合においても、閾値調整部４４は、さらに分割閾値および統合閾値の双方または一方を小さく調整してもよい。上述したように、分割プログラムの粒度が小さくなることで並行実行可能な分割プログラム数が増加し、予測実行時間のさらなる短縮の可能性があるからである。
【００４３】
また、目標短縮率を達成している場合、閾値調整部４４は、分割閾値および統合閾値の双方または一方を大きく調整してもよい。分割プログラムの粒度が大きくなることで、関数呼び出しの回数が減少し、関数を呼び出すスレッドの切替え時間や、ＯＳによる実行タスク切替えの時間等（以下、「オーバーヘッド時間」と呼ぶ。）を低減でき、予測実行時間のさらなる短縮の可能性があるからである。例えば、分割プログラム生成部３８により、第１の分割プログラム群と第２の分割プログラム群とが生成され、どちらの分割プログラム群とも同じ予測実行時間であったとする。このとき、第１の分割プログラム群におけるプログラムの粒度が第２の分割プログラム群におけるプログラムの粒度より大きければ、上述したオーバーヘッド時間の存在により、第１の分割プログラム群の方が実際の実行時間は速くなる。
【００４４】
図８の例では、分割前実行時間「１．２ミリ秒」に対し予測実行時間は「０．８ミリ秒」であるため、その短縮率は「３３％」となっている。ユーザにより指定された目標短縮率が「３０％」の場合、目標短縮率を達成しているため、閾値調整部４４は、オーバーヘッド時間をさらに低減するべく、図２で示す分割閾値・統合閾値を大きくしてもよい。一方で目標短縮率が「３５％」である場合、目標達成率に未達であるため、閾値調整部４４は、分割プログラムの並行実行数を増やすべく、図２で示す分割閾値・統合閾値を小さくしてもよい。図１に戻る。
【００４５】
インタフェース調整部４６は、複数の分割プログラムそれぞれに含まれる変数の参照関係を特定し、各分割プログラムの実行において必要な変数にアクセスできるように、各分割プログラムの入出力インタフェースを決定する。この変数には、分割プログラム内で生成される変数や、グローバル変数、オブジェクトへの参照を格納した変数、数値データを格納した変数等、様々な変数が含まれる。入出力インタフェースとは、例えば、各分割プログラムの関数の引数および返り値である。なお、変数自体を特定する方法については、順序規則判定部４０で既述した方法と同様に既知の技術を使用してよい。
【００４６】
まず、インタフェース調整部４６は、図７で示す変数の参照関係を特定する。例えば、変数「見積もり結果」は、「Module MainProgram_2」で生成され、「Module MainProgram_3」で参照されている。このとき、インタフェース調整部４６は、変数「見積もり結果」を「Module MainProgram_2」の返り値として決定し、一方で「Module MainProgram_3」の引数として決定する。続いて、インタフェース調整部４６は、各分割プログラムの引数および返り値を上述した決定に基づいて設定する。具体的には、図６（ａ）および（ｂ）でのダミー値部分に設定する。なお、図７では図示していないが、例えば、「Module MainProgram_1」で参照されている変数「メッセージ」は、当該分割プログラム内では生成されていない。このため、インタフェース調整部４６は、「Module MainProgram_1」の引数に変数「メッセージ」を設定する。
【００４７】
図９は、図３で示したソースプログラムを分割したあとの構成を示す。同図は、図６（ａ）および（ｂ）で示した分割プログラムを示し、各分割プログラムにはインタフェース調整部４６により決定された入出力インタフェースが設定された状態を示している。結果出力部１４は、同図で示す８つの分割プログラムを最終的にユーザに向けて出力する。図９と図３とを比較すると、サブルーチン階層のプログラムが４つとなったのに伴い、「Module MainProgram」も４つに分割され、呼び出し元スレッドも並行実行数に伴い２つとなっている。また同図の「呼び出し元スレッド２」は、各分割プログラムの入出力インタフェースに併せて、必要な引数を設定して各分割プログラムを呼び出している。
【００４８】
なお、本実施の形態の説明では、図４および図５で示したようにサブルーチン単位の分割では、各分割プログラムの実行時間が分割閾値より大きくなったため、サブルーチンをさらに命令文単位に分割した。しかし、サブルーチン単位に分割した地点で分割閾値以下となる場合には、サブルーチンのさらなる分割は必要ないため、この場合には、図３の「Module MainProgram」のみの分割となる。逆に、図５においてサブルーチンを分割しても、分割閾値を上回る場合には、さらにサブルーチンが呼び出すプログラムも分割対象となる。
【００４９】
以下、プログラム分割装置１００における処理の流れをフローチャートにて説明する。
図１０（ａ）は、プログラム分割における一連の処理を示すフローチャートである。要求検出部１２は、ユーザによるソースプログラムと目標短縮率との指定を検出する（Ｓ１０）。ソースプログラム取得部３２は、ユーザにより指定されたソースプログラムを取得する（Ｓ１２）。ソースプログラム分割部３４は、ソースプログラムを複数のブロックに分割する（Ｓ１４）。実行時間取得部３６は、各ブロックの実行時間を取得する（Ｓ１６）。いずれかのブロック実行時間の分割前実行時間に対する割合が分割閾値より大きいとき（Ｓ１８のＹ）、Ｓ１４の処理に戻る。分割閾値よりも小さいとき（Ｓ１８のＮ）、分割プログラム生成部３８は、統合閾値に基づき１以上のブロックを統合して分割プログラムを生成する（Ｓ２０）。順序規則判定部４０は、各分割プログラムに含まれる変数の参照関係に基づき、分割プログラム間の順序規則の有無を判定する（Ｓ２２）。所定の割合以上の分割プログラムが順序規則を有するとき（Ｓ２４のＹ）、Ｓ１４の処理に戻る。順序規則を有する分割プログラムが所定の割合未満であるとき（Ｓ２４のＮ）、後述する図１０（ｂ）の処理を実行する。
【００５０】
図１０（ｂ）は、図１０（ａ）の後続の処理を示すフローチャートである。予測実行時間算出部４２は、後述する図１１で詳述する予測実行時間算出処理を実行して予測実行時間を算出する（Ｓ２６）。予測実行時間の分割前実行時間に対する短縮割合が目標短縮率に到達しない場合（Ｓ２８のＹ）、閾値調整部４４は、分割閾値および／または統合閾値を調整して（Ｓ３４）、図１０（ａ）のＳ１４の処理に戻る。目標短縮率を達成した場合（Ｓ２８のＮ）、インタフェース調整部４６は、各分割プログラムの入出力インタフェースを決定し（Ｓ３０）、結果出力部１４は、各分割プログラムと予測実行時間とを分割結果として出力する（Ｓ３２）。
【００５１】
図１１は、図１０（ｂ）の予測実行時間算出処理の詳細を示すフローチャートである。予測実行時間算出部４２は、分割プログラムの数だけ実行態様設定ループを繰り返す（Ｓ４０〜Ｓ４８）。分割プログラムが順序規則を有するとき（Ｓ４２のＹ）、予測実行時間算出部４２は、先に実行すべき分割プログラムのあとで当該分割プログラムを順次実行させるように設定する（Ｓ４４）。分割プログラムが順序規則を有しないとき（Ｓ４２のＮ）、予測実行時間算出部４２は、当該分割プログラムを他の分割プログラムと並行実行させるように設定する（Ｓ４６）。以上の実行態様設定ループを実行したあと（Ｓ４８）、予測実行時間算出部４２は、各分割プログラムに設定した実行態様にしたがって予測実行時間を算出する（Ｓ５０）。
【００５２】
本実施の形態によれば、プログラム分割の結果、すなわち分割プログラムおよび予測実行時間を自動で生成してシステム開発者等に提供できる。プログラム分割の結果が自動で生成されることで、システム開発者の性能チューニング作業等を自動化し、システム開発者の負担を軽減できる。また、性能チューニング作業は、チューニング対象となるプログラムの開発言語等に精通したシステム開発者により行われるが、性能チューニング作業を自動化できることで、性能チューニング担当者に要求されるスキルレベルを低減できる。言い換えれば、システム開発者は、機能を充足するプログラムを開発すれば、あとはプログラム分割装置１００にプログラム分割を実行させることで、自動的に実行時間が小さい分割プログラムを生成できる。
【００５３】
また、本実施の形態によれば、ソースプログラム分割部３４は、分割閾値に基づき、ソースプログラムを複数のブロックに分割する。その一方で、分割プログラム生成部３８は、統合閾値に基づき、可能な場合には２以上のブロックを統合して分割プログラムを生成する。既述したように、ソースプログラムの分割は、サブルーチン単位・ファンクション単位・命令文単位等に基づき、画一的に実行される。この場合、過度に細かく分割されてしまうブロックも発生し、ブロック数の増加はオーバーヘッド時間の増大も招く。分割閾値とは別に統合閾値を設けることで、過度に細かく分割された２以上のブロックを統合して１つの分割プログラムを生成できる。これにより、オーバーヘッド時間の増大を抑制できる。
【００５４】
さらに、本実施の形態によれば、閾値調整部４４により分割閾値および／または統合閾値を調整し、繰り返し予測実行時間を算出する。閾値を小さくすることにより分割プログラムの粒度を小さくして、分割プログラムの並行実行数を増加させ、予測実行時間の短縮を実現する。また、閾値を大きくすることにより分割プログラムの粒度を大きくして、分割プログラムの実行におけるオーバーヘッド時間を抑制し、予測実行時間の短縮を実現する。プログラム分割装置１００は、閾値調整部４４による繰り返し実行により、並行実行数とオーバーヘッド時間の最適な均衡点を特定し、予測実行時間を最小とする分割プログラムを生成できる。また、ユーザにより指定された目標短縮率を実現し、または少なくとも目標短縮率に近い予測実行時間を実現する分割プログラムを生成できる。
【００５５】
さらにまた、本実施の形態によれば、インタフェース調整部４６により各分割プログラムの入出力インタフェースを設定できる。これにより、システム開発者の負担を低減できる。すなわち、インタフェース調整部４６により、一の分割プログラムの実行に必要とされるデータは当該一の分割プログラムの引数として設定され、別の分割プログラムの実行に必要とされるデータは当該一の分割プログラムの返り値として設定される。これにより、システム開発者は、各分割プログラムを修正する必要はなく、分割プログラムを呼び出すコード、例えば並行呼び出しをする場合にはマルチスレッドによる呼び出しコード等のみを作成すればよく、負担が低減される。
【００５６】
以上、本発明を実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【００５７】
請求項に記載の各構成要件が果たすべき機能は、本実施例において示された各機能ブロックの単体もしくはそれらの連係によって実現されることも当業者には理解されるところである。
【００５８】
実行時間取得部３６は、ログ等から取得した各ブロックの実行時間を所定のオーバーヘッド時間だけ増加させてもよい。これにより、プログラムを分割することによるペナルティ、すなわち、分割プログラムの粒度が小さくその数が多い場合のオーバーヘッド時間の増加についても実行時間に加味することができ、より適切な分割プログラムが生成されやすくなる。
【図面の簡単な説明】
【００５９】
【図１】本発明の実施の形態におけるプログラム分割装置の機能構成を示すブロック図である。
【図２】閾値情報のデータ構造を示す図である。
【図３】実行時間を短縮させる対象となるソースプログラムを示す図である。
【図４】図３のコードブロックに対応するサブルーチンの実行時間を示す図である。
【図５】図４のサブルーチンがさらに分割された場合の実行時間を示す図である。
【図６（ａ）】サブルーチン階層における分割プログラムを示す図である。
【図６（ｂ）】メインルーチンの分割プログラムを示す図である。
【図７】図６（ｂ）の各分割プログラムに含まれる変数の参照関係を示す図である。
【図８】予測実行時間の算出を模式的に示す図である。
【図９】図３で示したソースプログラムを分割したあとの構成を示す図である。
【図１０（ａ）】プログラム分割における一連の処理を示すフローチャートである。
【図１０（ｂ）】図１０（ａ）の後続の処理を示すフローチャートである。
【図１１】図１０（ｂ）の予測実行時間算出処理の詳細を示すフローチャートである。
【符号の説明】
【００６０】
１０  ユーザインタフェース処理部、１２  要求検出部、１４  結果出力部、２０  データ保持部、２２  閾値情報保持部、３０  データ処理部、３２  ソースプログラム取得部、３４  ソースプログラム分割部、３６  実行時間取得部、３８  分割プログラム生成部、４０  順序規則判定部、４２  予測実行時間算出部、４４  閾値調整部、４６  インタフェース調整部、１００  プログラム分割装置、１０２  閾値欄、１０４  閾値データ欄、１１２，１１４，１１６，１２２，１２４，１２６  コードブロック、１３２  モジュール欄、１３４  現在日時欄、１３６  見積もり結果欄、１３８  信用調査要求電文欄。
【図１】
2009187331.tif 000003
【図２】
2009187331.tif 000004
【図３】
2009187331.tif 000005
【図４】
2009187331.tif 000006
【図５】
2009187331.tif 000007
【図６（ａ）】
2009187331.tif 000008
【図６（ｂ）】
2009187331.tif 000009
【図７】
2009187331.tif 000010
【図８】
2009187331.tif 000011
【図９】
2009187331.tif 000012
【図１０（ａ）】
2009187331.tif 000013
【図１０（ｂ）】
2009187331.tif 000014
【図１１】
2009187331.tif 000015