(57)【要約】【課題】限られた開発者資源を有効に活用して、対象プログラムの性能を向上する。【解決手段】ソース解析部１２０は、ソース記憶部１１０が記憶した対象プログラムのソースコードに基づいて、対象プログラムのプログラム構造を解析する。トレース挿入部１３０は、ソース解析部１２０が解析したプログラム構造に基づいて、ソースコードにトレース命令を挿入する。実行モジュール生成部１４０は、トレース挿入部１３０がトレース命令を挿入したソースコードに基づいて、実行モジュールを生成する。実行装置８２１は、実行モジュール生成部１４０が生成した実行モジュールを実行して、実行ログを記録する。最適化箇所判定部１６０は、実行装置８２１が記録した実行ログに基づいて、最適化箇所を判定する。【選択図】図４
2009211424.tif 000002
【特許請求の範囲】
【請求項１】
データを記憶する記憶装置と、データを処理する処理装置と、ソース記憶部と、ソース解析部と、トレース挿入部と、実行モジュール生成部と、最適化箇所判定部とを有し、
上記ソース記憶部は、上記記憶装置を用いて、対象となる対象プログラムのソースコードを記憶し、
上記ソース解析部は、上記処理装置を用いて、上記ソース記憶部が記憶したソースコードに基づいて、上記対象プログラムのプログラム構造を解析し、
上記トレース挿入部は、上記処理装置を用いて、上記ソース解析部が解析したプログラム構造に基づいて、上記対象プログラムの実行状況を記録するトレース命令を、上記ソース記憶部が記憶したソースコードに挿入し、
上記実行モジュール生成部は、上記処理装置を用いて、上記トレース挿入部がトレース命令を挿入したソースコードに基づいて、実行装置が実行できる形式の実行モジュールを生成し、
上記最適化箇所判定部は、上記処理装置を用いて、上記実行モジュール生成部が生成した実行モジュールを上記実行装置が実行することにより上記トレース挿入部が挿入したトレース命令を上記実行装置が実行して上記実行装置が記録した実行状況に基づいて、上記ソース解析部が解析したプログラム構造に基づいて上記ソース記憶部が記憶したソースコードを分割した複数のプログラムブロックのうちから、上記ソースコードを改善すべきプログラムブロックを判定することを特徴とする最適化箇所判定装置。
【請求項２】
上記最適化箇所判定部は、上記処理装置を用いて、上記複数のプログラムブロックそれぞれについて、上記ソースコードを改善することにより得られる上記対象プログラムの性能向上の効果を予測し、予測した性能向上の効果に基づいて、上記ソースコードを改善すべきプログラムブロックを判定することを特徴とする請求項１に記載の最適化箇所判定装置。
【請求項３】
上記最適化箇所判定部は、上記処理装置を用いて、上記実行装置が記録した実行状況に基づいて、上記複数のプログラムブロックそれぞれについて、上記プログラムブロックが実行された実行回数を算出し、算出した実行回数が多いほど性能向上の効果が高いものとして、上記対象プログラムの性能向上の効果を予測することを特徴とする請求項２に記載の最適化箇所判定装置。
【請求項４】
上記最適化箇所判定部は、上記処理装置を用いて、上記複数のプログラムブロックそれぞれについて、上記ソースコードを改善する作業の難易度を予測し、予測した作業の難易度に基づいて、上記ソースコードを改善すべきプログラムブロックを判定することを特徴とする請求項１乃至請求項３のいずれかに記載の最適化箇所判定装置。
【請求項５】
上記最適化箇所判定部は、上記処理装置を用いて、上記ソース解析部が解析したプログラム構造に基づいて、上記プログラムブロックの規模を算出し、算出した規模が小さいほど作業の難易度が高いものとして、上記ソースコードを改善する作業の難易度を予測することを特徴とする請求項４に記載の最適化箇所判定装置。
【請求項６】
上記最適化箇所判定部は、上記処理装置を用いて、上記ソース解析部が解析したプログラム構造に基づいて、上記プログラムブロックの構造の複雑さを算出し、算出した構造の複雑さが単純であるほど作業の難易度が高いものとして、上記ソースコードを改善する作業の難易度を予測することを特徴とする請求項４または請求項５に記載の最適化箇所判定装置。
【請求項７】
請求項１乃至請求項６のいずれかに記載の最適化箇所判定装置と、上記実行モジュール生成部が生成した実行モジュールを実行する実行装置とを有することを特徴とする最適化箇所判定システム。
【請求項８】
請求項１乃至請求項６のいずれかに記載の最適化箇所判定装置として、コンピュータを機能させることを特徴とするコンピュータプログラム。
【請求項９】
データを記憶する記憶装置と、データを処理する処理装置とを有する最適化箇所判定装置が、対象プログラムの最適化箇所を判定する最適化箇所判定方法において、
上記処理装置が、上記対象プログラムのソースコードに基づいて、上記対象プログラムのプログラム構造を解析し、
上記処理装置が、解析したプログラム構造に基づいて、上記対象プログラムの実行状況を記録するトレース命令を、上記ソースコードに挿入し、
上記処理装置が、上記トレース命令を挿入したソースコードに基づいて、実行装置が実行できる形式の実行モジュールを生成し、
上記実行装置が、上記最適化箇所判定装置が生成した実行モジュールを実行することにより、上記最適化箇所判定装置が挿入したトレース命令を実行して、上記対象プログラムの実行状況を記録し、
上記処理装置が、解析したプログラム構造に基づいて上記対象プログラムのソースコードを分割した複数のプログラムブロックのうちから、上記実行装置が記録した実行状況に基づいて、上記ソースコードを改善すべきプログラムブロックを判定することを特徴とする最適化箇所判定方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータプログラムの性能を向上するための作業を効率化するため、コンピュータプログラムのソースコードを改善すべきプログラムブロックを判定する最適化箇所判定装置に関する。
【背景技術】
【０００２】
ソフトウェア開発において、システム試験のような検証段階において、速度性能の未達成または劣化が指摘されることが多々ある。発覚した性能問題に対し、その原因となる箇所を特定する技術として、動的解析がある。これは、プログラムの任意の地点に置かれた命令を実行する時刻を記録し、時系列で分析することによって、ボトルネックとなっている処理が記述された箇所を特定する技術であり、一般的にプロファイリングと呼ばれる。
また一方で、速度性能は処理内容によって決まるが、性能を考慮した最適化プログラミングは、開発者の知識や経験といったスキルにも依存するため、一定品質を保つことが難しい。ソフトウェアの品質を確保するための技術として、静的解析がある。ソースコードに記述された内容を調べることで、プログラムを実行せずに論理的な誤りや問題となりうるコードを予測して指摘する技術である。
【特許文献１】特開２００１−２８２５４６号公報
【特許文献２】特開２００２−２５９１６７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
組込み製品の開発では、ハードウェアのコスト制約が厳しいため、ソフトウェアにおいて速度性能を意識した最適なプログラミング技術が求められる。しかしながら、近年の組込みソフトウェア開発規模の拡大によって、組込みソフトウェア開発のスキルを持った開発者の確保が難しくなってきており、様々な品質のソースコードが混在することになっている。
また、大規模なソフトウェアの開発では、機能単位で分割して開発管理を行われ、システム試験のような検証段階ではじめてソフトウェア全体のモジュールが結合される。ある機能単位を他のベンダに委託することもあり、実行時の性能の予測は難しい。
そのため、性能問題の多くは、システム試験といった開発工程の終盤過程に発覚することになる。発覚した性能問題は、処理の見直しやチューニングによって、許容されるレベルまで改善を図ることになるが、現実的には、納期までの短期間において、ソフトウェア構造の変更を伴うような大規模な改修は困難である。また、チューニングの内容は、対象とするハードウェア構成やシステムアーキテクチャによって変わってくるため、開発者のスキルや経験に依存するところが大きい。
この発明は、例えば、上記のような課題を解決するためになされたものであり、対象プログラムの性能を向上するため、限られた開発者資源を有効に活用できるよう、必要な情報を提供することを目的とする。
【課題を解決するための手段】
【０００４】
この発明にかかる最適化箇所判定装置は、
データを記憶する記憶装置と、データを処理する処理装置と、ソース記憶部と、ソース解析部と、トレース挿入部と、実行モジュール生成部と、最適化箇所判定部とを有し、
上記ソース記憶部は、上記記憶装置を用いて、対象となる対象プログラムのソースコードを記憶し、
上記ソース解析部は、上記処理装置を用いて、上記ソース記憶部が記憶したソースコードに基づいて、上記対象プログラムのプログラム構造を解析し、
上記トレース挿入部は、上記処理装置を用いて、上記ソース解析部が解析したプログラム構造に基づいて、上記対象プログラムの実行状況を記録するトレース命令を、上記ソース記憶部が記憶したソースコードに挿入し、
上記実行モジュール生成部は、上記処理装置を用いて、上記トレース挿入部がトレース命令を挿入したソースコードに基づいて、実行装置が実行できる形式の実行モジュールを生成し、
上記最適化箇所判定部は、上記処理装置を用いて、上記実行モジュール生成部が生成した実行モジュールを上記実行装置が実行することにより上記トレース挿入部が挿入したトレース命令を上記実行装置が実行して上記実行装置が記録した実行状況に基づいて、上記ソース解析部が解析したプログラム構造に基づいて上記ソース記憶部が記憶したソースコードを分割した複数のプログラムブロックのうちから、上記ソースコードを改善すべきプログラムブロックを判定することを特徴とする。
【発明の効果】
【０００５】
この発明にかかる最適化箇所判定装置によれば、実行モジュール生成部が生成した実行モジュールを実行装置が実行することにより記録した実行状況に基づいて、ソースコードを改善すべきプログラムブロックを判定するので、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当てて、有効活用することができる。
【発明を実施するための最良の形態】
【０００６】
実施の形態１．
実施の形態１について、図１〜図１１を用いて説明する。
【０００７】
図１は、この実施の形態におけるプログラム最適化システム８００の全体構成の一例を示すシステム構成図である。
【０００８】
プログラム最適化システム８００は、プログラムの性能を向上するため、プログラムを最適化するシステムである。
プログラム最適化システム８００は、性能評価システム８１０、最適化箇所判定システム８２０、ソース作成装置８３０を有する。
【０００９】
性能評価システム８１０は、最適化の対象となるプログラム（以下「対象プログラム」と呼ぶ。）のソースコード７１０に基づいて、対象プログラムの性能を評価し、評価結果７２０を出力する。性能評価システム８１０は、例えば、ソースコード７１０をコンパイルして実行モジュールを生成し、生成した実行モジュールを実際に実行することにより、実行にかかる時間などを測定し、測定した結果を評価結果７２０とする。
管理者９６０は、性能評価システム８１０が出力した評価結果７２０を見て、対象プログラムの最適化が必要かどうかを判断する。
【００１０】
最適化箇所判定システム８２０は、管理者９６０が対象プログラムの最適化が必要だと判断した場合、ソースコード７１０に基づいて、ソースコード７１０のなかから、対象プログラムの性能を向上するために最適化すべき箇所（以下「最適化箇所」と呼ぶ。）を判定し、判定結果７３０を出力する。
管理者９６０は、最適化箇所判定システム８２０が出力した判定結果７３０を見て、複数の開発者９５０に作業を割り当てる。
【００１１】
複数の開発者９５０はそれぞれ、割り当てられた作業に基づいて、ソース作成装置８３０を用いて、ソースコード７１０を修正し、対象プログラムを最適化する。
【００１２】
性能評価システム８１０は、修正されたソースコード７１０に基づいて、再び、対象プログラムの性能を評価する。満足のいく性能が得られるまで、以上の作業が繰り返される。
【００１３】
最適化箇所判定システム８２０は、最適化箇所判定装置１００、実行装置８２１を有する。
最適化箇所判定装置１００は、ソースコード７１０を入力し、入力したソースコード７１０に基づいて、最適化箇所を判定するために必要な情報を得るため実行装置８２１に実行させる実行モジュールを生成する。
実行装置８２１は、最適化箇所判定装置１００が生成した実行モジュールを実行し、実行状況を記録した実行ログを生成する。
最適化箇所判定装置１００は、実行装置８２１が生成した実行ログに基づいて、最適化箇所を判定し、判定結果７３０を出力する。
【００１４】
図２は、この実施の形態における最適化箇所判定装置１００の外観の一例を示す図である。
最適化箇所判定装置１００は、システムユニット９１０、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）やＬＣＤ（液晶）の表示画面を有する表示装置９０１、キーボード９０２（Ｋｅｙ・Ｂｏａｒｄ：Ｋ／Ｂ）、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、コンパクトディスク装置９０５（ＣＤＤ）、プリンタ装置９０６、スキャナ装置９０７などのハードウェア資源を備え、これらはケーブルや信号線で接続されている。
システムユニット９１０は、コンピュータであり、ファクシミリ機９３２、電話器９３１とケーブルで接続され、また、ローカルエリアネットワーク９４２（ＬＡＮ）、ゲートウェイ９４１を介してインターネット９４０に接続されている。
【００１５】
図３は、この実施の形態における最適化箇所判定装置１００のハードウェア資源の一例を示す図である。
最適化箇所判定装置１００は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３、ＲＡＭ９１４、通信装置９１５、表示装置９０１、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５、プリンタ装置９０６、スキャナ装置９０７、磁気ディスク装置９２０と接続され、これらのハードウェアデバイスを制御する。磁気ディスク装置９２０の代わりに、光ディスク装置、メモリカード読み書き装置などの記憶装置でもよい。
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、磁気ディスク装置９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置あるいは記憶部の一例である。
通信装置９１５、キーボード９０２、スキャナ装置９０７、ＦＤＤ９０４などは、入力部、入力装置の一例である。
また、通信装置９１５、表示装置９０１、プリンタ装置９０６などは、出力部、出力装置の一例である。
【００１６】
通信装置９１５は、ファクシミリ機９３２、電話器９３１、ＬＡＮ９４２等に接続されている。通信装置９１５は、ＬＡＮ９４２に限らず、インターネット９４０、ＩＳＤＮ等のＷＡＮ（ワイドエリアネットワーク）などに接続されていても構わない。インターネット９４０或いはＩＳＤＮ等のＷＡＮに接続されている場合、ゲートウェイ９４１は不用となる。
磁気ディスク装置９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。
【００１７】
上記プログラム群９２３には、以下に述べる実施の形態の説明において「〜部」として説明する機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ９１１により読み出され実行される。
ファイル群９２４には、以下に述べる実施の形態の説明において、「〜の判定結果」、「〜の計算結果」、「〜の処理結果」として説明する情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリになどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示などのＣＰＵの動作に用いられる。抽出・検索・参照・比較・演算・計算・処理・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
また、以下に述べる実施の形態の説明において説明するフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、ＲＡＭ９１４のメモリ、ＦＤＤ９０４のフレキシブルディスク、ＣＤＤ９０５のコンパクトディスク、磁気ディスク装置９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｋ）等の記録媒体に記録される。また、データや信号は、バス９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【００１８】
また、以下に述べる実施の形態の説明において「〜部」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。すなわち、「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。すなわち、プログラムは、以下に述べる「〜部」としてコンピュータを機能させるものである。あるいは、以下に述べる「〜部」の手順や方法をコンピュータに実行させるものである。
【００１９】
なお、プログラム最適化システム８００を構成する他の装置も、最適化箇所判定装置１００と同様のハードウェア資源を有する。
【００２０】
図４は、この実施の形態における最適化箇所判定システム８２０の構成の一例を示すブロック構成図である。
【００２１】
最適化箇所判定システム８２０は、最適化箇所判定装置１００、実行装置８２１のほかに、実行モジュール記憶装置８２２、実行ログ記憶装置８２３を有する。
実行モジュール記憶装置８２２は、磁気ディスク装置９２０を用いて、最適化箇所判定装置１００が生成した実行モジュールを記憶する。
実行ログ記憶装置８２３は、磁気ディスク装置９２０を用いて、実行装置８２１が生成した実行ログを記憶する。
【００２２】
最適化箇所判定装置１００は、ソース記憶部１１０、ソース解析部１２０、トレース挿入部１３０、実行モジュール生成部１４０、実行ログ取得部１５０、最適化箇所判定部１６０、判定結果表示部１７０を有する。
【００２３】
ソース記憶部１１０は、磁気ディスク装置９２０を用いて、ソースコード７１０を記憶する。
【００２４】
ソース解析部１２０は、ＣＰＵ９１１を用いて、ソース記憶部１１０が記憶したソースコード７１０に基づいて、対象プログラムのプログラム構造を解析する。例えば、ソース解析部１２０は、ソースコード７１０を解析することにより、対象プログラムのうち、関数、サブルーチン、割込処理など一まとまりの処理として実行されるブロック（以下「プログラムブロック」と呼ぶ。）の開始位置、終了位置などの情報を取得する。
【００２５】
トレース挿入部１３０は、ＣＰＵ９１１を用いて、ソース解析部１２０が解析したプログラム構造に基づいて、ソース記憶部１１０が記憶したソースコード７１０にトレース命令を挿入する。トレース命令とは、対象プログラムの実行状況を記録する命令であり、実行装置８２１がトレース命令を実行すると、例えば、ソースコード７１０内での位置、トレース命令が実行された時刻などの情報を、実行ログに記録する。
【００２６】
実行モジュール生成部１４０は、ＣＰＵ９１１を用いて、トレース挿入部１３０がトレース命令を挿入したソースコード（以下「動態測定用コード」と呼ぶ。）に基づいて、実行装置８２１が実行できる形式の実行モジュール（以下「動態測定用モジュール」と呼ぶ。）を生成する。例えば、実行モジュール生成部１４０は、ＣＰＵ９１１を用いて、動態測定用コードをコンパイルして、動態測定用モジュールを生成する。
【００２７】
実行モジュール記憶装置８２２は、磁気ディスク装置９２０を用いて、実行モジュール生成部１４０が生成した動態測定用モジュールを記憶する。
実行装置８２１は、ＣＰＵ９１１を用いて、実行モジュール記憶装置８２２が記憶した動態測定用モジュールを実行する。実行装置８２１が動態測定用モジュールを実行することにより、トレース挿入部１３０が挿入したトレース命令を実行装置８２１が実行し、実行ログを記録する。
実行ログ記憶装置８２３は、磁気ディスク装置９２０を用いて、実行装置８２１が記録した実行ログを記憶する。
【００２８】
実行ログ取得部１５０は、ＣＰＵ９１１を用いて、実行ログ記憶装置８２３が記憶した実行ログを取得する。
【００２９】
最適化箇所判定部１６０は、ＣＰＵ９１１を用いて、実行ログ取得部１５０が取得した実行ログに基づいて、最適化箇所を判定する。最適化箇所判定部１６０は、最適化箇所として、ソース解析部１２０が解析した解析結果に基づいて、ソースコード７１０をプログラムブロックに分割し、分割したプログラムブロックのなかから、最適化箇所を判定する。
【００３０】
判定結果表示部１７０は、表示装置９０１を用いて、最適化箇所判定部１６０が判定した最適化箇所の判定結果を表示して、管理者９６０に通知する。
【００３１】
図５は、この実施の形態における最適化箇所判定装置１００が最適化箇所を判定する最適化箇所判定処理の流れの一例を示すフローチャート図である。
【００３２】
ソース解析工程Ｓ５１１において、ソース解析部１２０は、ＣＰＵ９１１を用いて、ソース記憶部１１０が記憶したソースコード７１０を入力する。ソース解析部１２０は、ＣＰＵ９１１を用いて、入力したソースコード７１０に基づいて、対象プログラムのプログラム構造を解析し、プログラムブロックの開始位置などの情報を取得する。ソース解析部１２０は、磁気ディスク装置９２０を用いて、取得した情報を表わすデータ（以下「解析結果データ」と呼ぶ。）を記憶する。
【００３３】
トレース挿入工程Ｓ５１２において、トレース挿入部１３０は、ＣＰＵ９１１を用いて、ソース記憶部１１０が記憶したソースコード７１０と、ソース解析工程Ｓ５１２でソース解析部１２０が記憶した解析結果データとを入力する。トレース挿入部１３０は、ＣＰＵ９１１を用いて、入力した解析結果データが表わす情報に基づいて、プログラムブロックの開始位置など、トレース命令を挿入すべき位置を判別する。トレース挿入部１３０は、ＣＰＵ９１１を用いて、入力したソースコード７１０に基づいて、判別した位置にトレース命令を挿入して、動態測定用コードを生成する。トレース挿入部１３０は、磁気ディスク装置９２０を用いて、生成した動態測定用コードを記憶する。
【００３４】
実行モジュール生成工程Ｓ５１３において、実行モジュール生成部１４０は、ＣＰＵ９１１を用いて、トレース挿入工程Ｓ５１２でトレース挿入部１３０が記憶した動態測定用コードを入力する。実行モジュール生成部１４０は、ＣＰＵ９１１を用いて、入力した動態測定用コードに基づいて、動態測定用モジュールを生成する。実行モジュール生成部１４０は、ＣＰＵ９１１を用いて、生成した動態測定用モジュールを出力する。
実行モジュール記憶装置８２２は、ＣＰＵ９１１を用いて、実行モジュール生成部１４０が出力した動態測定用モジュールを入力する。実行モジュール記憶装置８２２は、磁気ディスク装置９２０を用いて、入力した動態測定用モジュールを記憶する。
【００３５】
モジュール実行工程Ｓ５１４において、実行装置８２１は、ＣＰＵ９１１を用いて、実行モジュール生成工程Ｓ５１３で実行モジュール記憶装置８２２が記憶した動態測定用モジュールを入力する。実行装置８２１は、ＣＰＵ９１１を用いて、入力した動態測定用モジュールを実行する。実行装置８２１は、ＣＰＵ９１１を用いて、動態測定用モジュールに含まれるトレース命令を実行することにより、実行時刻などの実行状況を表わすデータを出力する。
実行ログ記憶装置８２３は、ＣＰＵ９１１を用いて、実行装置８２１が出力したデータを入力する。実行ログ記憶装置８２３は、磁気ディスク装置９２０を用いて、入力したデータが表わす実行状況を、実行ログとして記憶する。
【００３６】
実行装置８２１による動態測定用モジュールの実行が終了したのち、実行ログ取得工程Ｓ５１５において、実行ログ取得部１５０は、ＣＰＵ９１１を用いて、実行ログ記憶装置８２３が記憶した実行ログを入力する。実行ログ取得部１５０は、磁気ディスク装置９２０を用いて、入力した実行ログを記憶する。
【００３７】
最適化箇所判定工程Ｓ５１６において、最適化箇所判定部１６０は、ＣＰＵ９１１を用いて、実行ログ取得工程Ｓ５１５で実行ログ取得部１５０が記憶した実行ログを入力する。最適化箇所判定部１６０は、ＣＰＵ９１１を用いて、入力した実行ログに基づいて、最適化箇所を判定する。最適化箇所判定部１６０は、磁気ディスク装置９２０を用いて、判定した結果を表わすデータを記憶する。
【００３８】
判定結果表示工程Ｓ５１７において、判定結果表示部１７０は、ＣＰＵ９１１を用いて、最適化箇所判定工程Ｓ５１６で最適化箇所判定部１６０が記憶したデータを入力する。判定結果表示部１７０は、ＣＰＵ９１１を用いて、入力したデータが表わす判定結果７３０を表示する。
【００３９】
図６は、この実施の形態におけるソース解析部１２０が生成する解析結果データ７４０の一例を示す図である。
解析結果データ７４０には、例えば、関数名７４１、パス名７４２、開始行番号７４３、終了行番号７４４、リターン行番号リスト７４５などのデータが含まれる。
【００４０】
関数名７４１は、「関数」（プログラムブロック）の名称を表わす文字列データである。
パス名７４２は、ソース記憶部１１０が磁気ディスク装置９２０に記憶したテキストファイル（ソースコード７１０）のパスを表わす文字列データである。
開始行番号７４３は、パス名７４２が表わすテキストファイルのなかで、関数名７４１が表わす「関数」の始まりである行の行番号を表わす数値データである。
終了行番号７４４は、パス名７４２が表わすテキストファイルのなかで、関数名７４１が表わす「関数」の終りである行の行番号を表わす数値データである。
リターン行番号リスト７４５は、パス名７４２が表わすテキストファイルのなかで、関数名７４１が表わす「関数」のうち最後に実行する命令（例えば「ｒｅｔｕｒｎ文」）を記述した行の行番号のリストを表わすデータである。条件分岐などにより、一つの「関数」のなかに、最後に実行する命令が複数ある場合もあるので、リターン行番号リスト７４５は、１以上の行番号からなるリストを表わす。
【００４１】
この例において、ソース記憶部１１０は三つのソースコード７１０「／ｓｒｃ／ｓａｍｐｌｅ．ｃ」「／ｓｒｃ／ｕｔｉｌ．ｃ」「／ｓｒｃ／ｄｒｖ．ｃ」を記憶している。
ソース解析部１２０は、この三つのソースコード７１０を解析して、四つの関数（プログラムブロック）「Ｆｕｎｃ＿１」「Ｆｕｎｃ＿２」「Ｆｕｎｃ＿３」「Ｆｕｎｃ＿４」が含まれていることを判別し、関数「Ｆｕｎｃ＿１」がソースコード７１０「／ｓｒｃ／ｓａｍｐｌｅ．ｃ」のなかの１２行目から７２行目までに記述されていることを判別し、関数「Ｆｕｎｃ＿１」のうち最後に実行する命令が、ソースコード７１０「／ｓｒｃ／ｓａｍｐｌｅ．ｃ」のなかの７１行目に記述されていることを判別して、解析結果データ７４０を生成している。
【００４２】
例えば、ソース解析部１２０は、ＣＰＵ９１１を用いて、ソースコード７１０を一行ずつ読み込み、読み込んだ一行分のテキストが、「型宣言」（ｖｏｉｄ、ｉｎｔ、ｄｏｕｂｌｅなど）＋「関数名」（ソース解析部１２０が抽出する「Ｆｕｎｃ＿１」などの文字列）＋「（」＋「引数の型及び引数名のリスト」＋「）」＋「｛」という形式に合致するか否かを判定することにより、ソースコード７１０に含まれる関数を判別する。
ソース解析部１２０は、ＣＰＵ９１１を用いて、上述した形式に合致する行が、ソースコード７１０のなかの何行目にあたるかを算出して、算出した行番号を表わすデータを開始行番号７４３とする。
また、ソース解析部１２０は、ＣＰＵ９１１を用いて、その行に含まれる「｛」と対応する「｝」が、ソースコード７１０のなかの何行目に記述されているかを算出して、算出した行番号を表わすデータを終了行番号７４４とする。
更に、ソース解析部１２０は、ＣＰＵ９１１を用いて、ソースコード７１０のなかの開始行番号７４３が表わす行と終了行番号７４４が表わす行との間から、「ｒｅｔｕｒｎ文」が記述された行を探して、「ｒｕｔｕｒｎ文」が記述された行の行番号のリストを生成し、生成したリストを表わすデータをリターン行番号リスト７４５とする。
【００４３】
トレース挿入部１３０は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成した解析結果データ７４０に基づいて、トレース命令をソースコード７１０に挿入する。
この例において、トレース挿入部１３０は、ＣＰＵ９１１を用いて、ソースコード７１０「／ｓｒｃ／ｓａｍｐｌｅ．ｃ」の１２行目（開始行番号７４３が表わす行）とその次の行（１３行目）との間に、関数「Ｆｕｎｃ＿１」の入口における実行時刻を実行ログに書き出すトレース命令を挿入し、ソースコード７１０「／ｓｒｃ／ｓａｍｐｌｅ．ｃ」の７１行目（リターン行番号リスト７４５が表わす行）とその前の行（７０行目）との間に、関数「Ｆｕｎｃ＿１」の出口における実行時刻を実行ログに書き出すトレース命令を挿入する。同様に、トレース挿入部１３０は、ＣＰＵ９１１を用いて、ソースコード７１０「／ｓｒｃ／ｕｔｉｌ．ｃ」の１５行目と１６行目との間と、４３行目と４４行目との間と、４７行目と４８行目との間と、６２行目と６３行目との間と、１４５行目と１４６行目との間と、ソースコード７１０「／ｓｒｃ／ｄｒｖ．ｃ」の１０行目と１１行目との間と、２８行目と２９行目との間とに、それぞれトレース命令を挿入する。
【００４４】
図７は、この実施の形態における実行装置８２１が動態測定用モジュールを実行して、生成する実行ログ７５０の一例を表わす図である。
実行ログ７５０には、例えば、実行時刻７５１、トレース種別７５２、トレースパラメータ７５３などのデータが含まれる。
【００４５】
実行時刻７５１は、トレース命令が実行された時刻を、例えばミリ秒単位の秒数で表わす数値データである。
トレース種別７５２は、トレース命令が挿入された場所の種別を表わすデータである。り、この例では、関数の入口であることを表わす「ｆｕｎｃ  ｅｎｔｒｙ」、関数の出口であることを表わす「ｆｕｎｃ  ｅｘｉｔ」などの文字列データをトレース種別７５２としているが、これらの代わりに、関数の入口であることを表わす「１」、関数の出口であることを表わす「２」などの数値データを用いてもよい。
トレースパラメータ７５３は、トレース命令が挿入されたプログラムブロックの名称を表わす文字列データである。
【００４６】
次に、最適化箇所判定部１６０の詳細について説明する。
【００４７】
図８は、この実施の形態における最適化箇所判定部１６０の内部ブロックの構成の一例を示す詳細ブロック図である。
最適化箇所判定部１６０は、動的解析部１６１、静的解析部１６５、作業優先度算出部１６９を有する。
【００４８】
動的解析部１６１は、実行ログ取得部１５０が取得した実行ログ７５０に基づいて、最適化箇所を判定するのに必要な情報を算出する。動的解析部１６１は、例えば、プログラムブロックの実行時間、呼出し回数、呼出し関係、ループ回数、通過経路、その他実行ログ７５０の解析によって抽出可能な情報を算出する。
動的解析部１６１は、実行回数算出部１６２、実行時間算出部１６３、総実行時間算出部１６４を有する。
【００４９】
実行回数算出部１６２は、ＣＰＵ９１１を用いて、実行ログ７５０に基づいて、プログラムブロックごとに、そのプログラムブロックが実行された回数を算出する。一般的に、実行回数が多いプログラムブロックほど最適化の効果が大きく、実行回数が少ないプログラムブロックほど最適化の効果が小さくなる。
実行時間算出部１６３は、ＣＰＵ９１１を用いて、実行ログ７５０に基づいて、各プログラムブロックが実行されるたびごとに、そのプログラムブロックの実行にかかった実質実行時間（他のプログラムブロックを呼び出して、実行終了を待っていた時間や、割込み処理を実行していた時間を除く時間）を算出する。
総実行時間算出部１６４は、ＣＰＵ９１１を用いて、実行時間算出部１６３が算出した各プログラムブロックの実質実行時間に基づいて、プログラムブロックごとに、実質実行時間を合計し、そのプログラムブロックの総実行時間を算出する。一般的に、総実行時間が長いプログラムブロックほど最適化の効果が大きく、総実行時間が短いプログラムブロックほど最適化の効果が小さくなる。
【００５０】
静的解析部１６５は、ソース解析部１２０が生成した解析結果データ７４０に基づいて、最適化箇所を判定するのに必要な情報を算出する。静的解析部１６５は、例えば、プログラムブロックの開始地点、終了地点、命令ライン数、ループ・分岐ブロックの種別・開始点・終了点、関数呼び出し関係、その他静的解析によって抽出可能な情報を算出する。
静的解析部１６５は、規模算出部１６６、複雑度算出部１６７、難易度予測部１６８を有する。
【００５１】
規模算出部１６６は、ＣＰＵ９１１を用いて、解析結果データ７４０に基づいて、プログラムブロックごとに、そのプログラムブロックの規模を算出する。プログラムブロックの規模とは、例えば、そのプログラムブロックに含まれる命令の数や、ソースコード７１０におけるそのプログラムブロックの行数などである。一般的に、規模の大きいプログラムブロックほど最適化の余地が大きく、規模が小さいプログラムブロックほどそれ以上最適化することが難しくなる。
複雑度算出部１６７は、ＣＰＵ９１１を用いて、解析結果データ７４０に基づいて、プログラムブロックごとに、そのプログラムブロックの複雑度を算出する。プログラムブロックの複雑度とは、例えば、繰り返しループのネストの深さや条件分岐の数などである。一般的に、複雑なプログラムブロックほど最適化の余地が大きく、単純なプログラムブロックほどそれ以上最適化することが難しくなる。
難易度予測部１６８は、ＣＰＵ９１１を用いて、規模算出部１６６が算出したプログラムブロックの規模と、複雑度算出部１６７が算出したプログラムブロックの複雑度とに基づいて、プログラムブロックごとに、そのプログラムブロックを最適化する作業の難易度（以下「最適化難易度」と呼ぶ。）を予測する。
【００５２】
作業優先度算出部１６９は、ＣＰＵ９１１を用いて、実行回数算出部１６２が算出したプログラムブロックの実行回数と、総実行時間算出部１６４が算出したプログラムブロックの総実行時間と、難易度予測部１６８が算出したプログラムブロックの最適化難易度とに基づいて、プログラムブロックごとに、そのプログラムブロックを最適化する作業の優先度（以下「作業優先度」と呼ぶ。）を算出する。
例えば、作業優先度算出部１６９は、ＣＰＵ９１１を用いて、プログラムブロックの実行回数が多い場合や、プログラムブロックの総実行時間が長い場合など、最適化の効果が大きいと予測されるプログラムブロックについては、高い作業優先度を算出し、逆に、最適化の効果が小さいと予測されるプログラムブロックについては、低い作業優先度を算出する。また、作業優先度算出部１６９は、ＣＰＵ９１１を用いて、プログラムブロックの規模が大きい場合や、プログラムブロックの複雑度が高い場合など、最適化難易度が低いと予測されるプログラムブロックについては、高い作業優先度を算出し、逆に、最適化難易度が高いと予測されるプログラムブロックについては、低い作業優先度を算出する。
【００５３】
判定結果表示部１７０は、表示装置９０１を用いて、作業優先度算出部１６９が算出した作業優先度を、最適化箇所の判定結果７３０として表示する。例えば、判定結果表示部１７０は、表示装置９０１を用いて、作業優先度の高いものから順に、プログラムブロックを表示する。
【００５４】
大規模なソフトウェアの開発作業においては、ソフトウェアの各部分を多数の開発者が分担して作成し、開発の最終段階が近づいてから、多数の開発者が開発した各部分を組み合わせて、全体としての動作を検証する。
その結果、所望の処理速度が得られないなどして、対象プログラムの最適化が必要であることが判明した場合、開発期間が残りわずかであることから、開発者資源を有効に活用して、対象プログラムの最適化作業を行う必要がある。
【００５５】
実行回数が多いプログラムブロックは、プログラムの最適化によりわずかでも実行時間を短くすることができれば、対象プログラム全体としての実行時間を大幅に短くすることができるので、最適化の効果が大きく、優先的に最適化作業を行うべきである。
また、対象プログラム全体としての実行時間に対して、総実行時間の割合が高いプログラムブロックも、プログラムの最適化により実行時間を短くすることができれば、対象プログラム全体としての実行時間を短くすることができるので、最適化の効果が大きく、優先的に最適化作業を行うべきである。
【００５６】
逆に、最適化難易度の高いプログラムブロックは、最適化作業を行っても、実行時間をあまり短くすることができず、投入した開発者資源が無駄になってしまう場合があるので、最適化作業の優先順位を低くするべきである。
【００５７】
この実施の形態における最適化箇所判定装置１００は、このような基準に基づいて、プログラムブロックごとの作業優先度を算出するので、管理者９６０が、どのプログラムブロックの最適化に開発者資源を投入すればよいかを容易に判断でき、対象プログラムの最適化作業を効率的に行うことができる。
【００５８】
なお、判定結果表示部１７０は、表示装置９０１を用いて、難易度予測部１６８が予測した最適化難易度を、作業優先度とともに表示してもよい。
そうすれば、管理者９６０が、作業優先度が高いが最適化難易度も高いプログラムブロックの最適化作業に、スキルの高い開発者を投入するなど、開発者のスキルに応じた作業を割り当てることができるので、対象プログラムの最適化作業を、更に効率的に行うことができる。
【００５９】
図９は、この実施の形態における最適化箇所判定部１６０が、最適化箇所を判定する最適化箇所判定工程Ｓ５１６の詳細な処理の流れの一例を示すフローチャート図である。
【００６０】
規模算出工程Ｓ５２１において、規模算出部１６６は、ＣＰＵ９１１を用いて、ソース解析工程Ｓ５１１でソース解析部１２０が記憶した解析結果データ７４０を入力する。規模算出部１６６は、ＣＰＵ９１１を用いて、入力した解析結果データ７４０に基づいて、プログラムブロックそれぞれについて、プログラムブロックの規模を算出する。規模算出部１６６は、ＲＡＭ９１４を用いて、算出した規模を表わすデータ（以下「規模データ」と呼ぶ。）を記憶する。
【００６１】
複雑度算出工程Ｓ５２２において、複雑度算出部１６７は、ＣＰＵ９１１を用いて、ソース解析工程Ｓ５１１でソース解析部１２０が記憶した解析結果データ７４０を入力する。複雑度算出部１６７は、ＣＰＵ９１１を用いて、入力した解析結果データ７４０に基づいて、プログラムブロックそれぞれについて、プログラムブロックの複雑度を算出する。複雑度算出部１６７は、ＲＡＭ９１４を用いて、算出した複雑度を表わすデータ（以下「複雑度データ」と呼ぶ。）を記憶する。
【００６２】
難易度予測工程Ｓ５２３において、難易度予測部１６８は、ＣＰＵ９１１を用いて、規模算出工程Ｓ５２１で規模算出部１６６が記憶した規模データと、複雑度算出工程Ｓ５２２で複雑度算出部１６７が記憶した複雑度データとを入力する。難易度予測部１６８は、ＣＰＵ９１１を用いて、入力した規模データと複雑度データとが表わすプログラムブロックの規模と複雑度とに基づいて、プログラムブロックそれぞれの最適化難易度を予測する。難易度予測部１６８は、ＲＡＭ９１４を用いて、予測した最適化難易度を表わすデータ（以下「難易度データ」と呼ぶ。）を記憶する。
【００６３】
実行時間算出工程Ｓ５２４において、実行時間算出部１６３は、ＣＰＵ９１１を用いて、実行ログ取得工程Ｓ５１５で実行ログ取得部１５０が記憶した実行ログを入力する。実行時間算出部１６３は、ＣＰＵ９１１を用いて、入力した実行ログに基づいて、プログラムブロックの実行時それぞれについて、実質実行時間を算出する。実行時間算出部１６３は、ＲＡＭ９１４を用いて、算出した実質実行時間を表わすデータ（以下「実行時間データ」と呼ぶ。）を記憶する。
【００６４】
実行回数算出工程Ｓ５２５において、実行回数算出部１６２は、ＣＰＵ９１１を用いて、実行ログ取得工程Ｓ５１５で実行ログ取得部１５０が記憶した実行ログを入力する。実行回数算出部１６２は、ＣＰＵ９１１を用いて、入力した実行ログに基づいて、プログラムブロックそれぞれについて、実行回数を算出する。実行回数算出部１６２は、ＲＡＭ９１４を用いて、算出した実行回数を表わすデータ（以下「実行回数データ」と呼ぶ。）を記憶する。
【００６５】
総実行時間算出工程Ｓ５２６において、総実行時間算出部１６４は、ＣＰＵ９１１を用いて、実行時間算出工程Ｓ５２４で実行時間算出部１６３が記憶した実行時間データを入力する。総実行時間算出部１６４は、ＣＰＵ９１１を用いて、入力した実行時間データが表わす実質実行時間に基づいて、プログラムブロックそれぞれについて、総実行時間を算出する。総実行時間算出部１６４は、ＲＡＭ９１４を用いて、算出した総実行時間を表わすデータ（以下「総実行時間データ」と呼ぶ。）を記憶する。
【００６６】
作業優先度算出工程Ｓ５２７において、作業優先度算出部１６９は、ＣＰＵ９１１を用いて、難易度予測工程Ｓ５２３で難易度予測部１６８が記憶した難易度データと、実行回数算出工程Ｓ５２５で実行回数算出部１６２が記憶した実行回数データと、総実行時間算出工程Ｓ５２６で総実行時間算出部１６４が記憶した総実行時間データとを入力する。作業優先度算出部１６９は、ＣＰＵ９１１を用いて、入力した難易度データと実行回数データと総実行時間データとが表わす最適化難易度と実行回数と総実行時間とに基づいて、プログラムブロックそれぞれについて、作業優先度を算出する。作業優先度算出部１６９は、磁気ディスク装置９２０を用いて、算出した作業優先度を表わすデータ（以下「作業優先度データ」と呼ぶ。）を判定結果７３０として記憶する。
【００６７】
図１０は、この実施の形態における最適化箇所判定部１６０が生成する各種データの一例を表わす図である。
【００６８】
規模算出部１６６は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成した解析結果データ７４０に基づいて、規模データ７８２を生成する。
規模データ７８２には、例えば、関数名７６１、規模７６２などのデータが含まれる。
関数名７６１は、解析結果データ７４０に含まれる関数名７４１と同じく、プログラムブロックの名称を表わす文字列データである。
規模７６２は、そのプログラムブロックの規模を表わす数値データである。
【００６９】
例えば、規模算出部１６６は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成した解析結果データ７４０を一行ずつ入力し、入力した解析結果データ７４０に基づいて、関数名７４１と、開始行番号７４３と、終了行番号７４４とを取得する。規模算出部１６６は、ＣＰＵ９１１を用いて、取得した関数名７４１を関数名７６１とする。規模算出部１６６は、ＣＰＵ９１１を用いて、取得した開始行番号７４３と終了行番号７４４とに基づいて、そのプログラムブロックの行数（終了行番号７４４−開始行番号７４３）を算出して、規模７６２とする。
なお、規模算出部１６６がプログラムブロックの行数を算出して規模７６２とする場合、規模算出部１６６は、空行やコメント行を除いた行数を算出して、規模７６２としてもよい。そのほうが、最適化難易度の予測精度を高めることができるので、好ましい。
また、規模算出部１６６が空行やコメント行を除いた行数を算出して規模７６２とする場合、規模算出部１６６がソースコード７１０を読み込んで、空行やコメント行の行数を算出してもよいし、ソース解析部１２０が空行やコメント行の行数を算出し、算出した行数を表わすデータを含む解析結果データ７４０を生成してもよい。
【００７０】
複雑度算出部１６７は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成した解析結果データ７４０に基づいて、複雑度データ７８３を生成する。
複雑度データ７８３には、例えば、関数名７６１、複雑度７６３などのデータが含まれる。
関数名７６１は、規模データ７８２に含まれる関数名７６１と同様である。
複雑度７６３は、そのプログラムブロックの複雑度を表わす数値データである。
【００７１】
例えば、複雑度算出部１６７は、ＣＰＵ９１１を用いて、ソース解析部１２０が生成した解析結果データ７４０を一行ずつ入力し、入力した解析結果データ７４０に基づいて、関数名７４１と、開始行番号７４３と、終了行番号７４４とを取得する。複雑度算出部１６７は、ＣＰＵ９１１を用いて、取得した関数名７４１を関数名７６１とする。複雑度算出部１６７は、ＣＰＵ９１１を用いて、取得した開始行番号７４３と終了行番号７４４とに基づいて、ソース記憶部１１０が記憶したソースコード７１０のうち、開始行番号７４３〜終了行番号７４４までの部分を入力する。複雑度算出部１６７は、ＣＰＵ９１１を用いて、入力したソースコード７１０の一部に含まれる文字「｛」の数を数えることにより、そのプログラムブロックに含まれるブロックの数を算出し、複雑度７６３とする。
なお、ソース解析部１２０が複雑度７６３を算出し、算出した複雑度７６３を含む解析結果データ７４０を生成してもよい。
【００７２】
難易度予測部１６８は、ＣＰＵ９１１を用いて、規模算出部１６６が生成した規模データ７８２と、複雑度算出部１６７が生成した複雑度データ７８３とに基づいて、難易度データ７８４を生成する。
難易度データ７８４には、例えば、関数名７６１、最適化難易度７６４などのデータが含まれる。
関数名７６１は、規模データ７８２や複雑度データ７８３に含まれる関数名７６１と同様である。
最適化難易度７６４は、そのプログラムブロックの最適化難易度を表わす数値データである。
【００７３】
例えば、難易度予測部１６８は、磁気ディスク装置９２０を用いて、あらかじめ難易度テーブル７７０を記憶している。難易度テーブル７７０は、プログラムブロックの規模と、その規模のプログラムブロックについて予測される最適化難易度との関係を表わすテーブルであり、例えば、規模上限７７１と難易度７７２とを含む。規模上限７７１は、プログラムブロックの規模の上限を表わす数値データであり、難易度７７２は、その規模のプログラムブロックについて予測される最適化難易度を表わす数値データである。この例における難易度テーブル７７０は、プログラムブロックの規模が「１０」以下であれば最適化難易度は「１」、規模が「１１」〜「２０」であれば最適化難易度は「２」と予測されることを表わしている。なお、この例では、最適化難易度の数値が大きいほど、最適化が容易であるという評価を表わす。
難易度予測部１６８は、ＣＰＵ９１１を用いて、規模算出部１６６が生成した規模データ７８２を一行ずつ入力し、入力した規模データ７８２に基づいて、関数名７６１と、規模データ７８２とを取得する。難易度予測部１６８は、ＣＰＵ９１１を用いて、取得した規模データ７８２に基づいて、難易度テーブル７７０を参照し、そのプログラムブロックについて予測される難易度７７２を取得する。
【００７４】
難易度予測部１６８は、同様に、磁気ディスク装置９２０を用いて、あらかじめ、プログラムブロックの複雑度と、その複雑度のプログラムブロックについて予測される最適化難易度とに関係を表わす難易度テーブルも記憶している（図示せず）。難易度予測部１６８は、ＣＰＵ９１１を用いて、複雑度算出部１６７が生成した複雑度データ７８３を一行ずつ入力し、入力した規模データ７８２に基づいて、関数名７６１と、複雑度データ７８３とを取得する。難易度予測部１６８は、ＣＰＵ９１１を用いて、取得した複雑度データ７８３に基づいて、難易度テーブルを参照し、そのプログラムブロックについて予測される難易度を算出する。
【００７５】
難易度予測部１６８は、ＣＰＵ９１１を用いて、同一のプログラムブロックについて、規模データ７８２に基づいて予測した最適化難易度と、複雑度データ７８３に基づいて予測した最適化難易度とに基づいて、二つの最適化難易度の合計あるいは平均を算出し、最適化難易度７６４とする。
【００７６】
図１１は、この実施の形態における最適化箇所判定部１６０が生成する各種データの一例を表わす図である。
【００７７】
総実行時間算出部１６４は、ＣＰＵ９１１を用いて、実行ログ取得部１５０が取得した実行ログ７５０に基づいて実行時間算出部１６３が生成した実行時間データ（図示せず）に基づいて、総実行時間データ７８５を生成する。
総実行時間データ７８５には、例えば、関数名７６１、総実行時間７６５などのデータが含まれる。
関数名７６１は、難易度データ７８４に含まれる関数名７６１と同様である。
総実行時間７６５は、そのプログラムブロックの総実行時間を表わす数値データである。
【００７８】
例えば、実行時間算出部１６３は、ＣＰＵ９１１を用いて、実行ログ取得部１５０が取得した実行ログ７５０を一行づつ入力し、入力した実行ログ７５０に基づいて、実行時刻７５１、トレース種別７５２、トレースパラメータ７５３を取得する。
実行時間算出部１６３は、ＣＰＵ９１１を用いて、取得したトレース種別７５２に基づいて、トレースの種別を判定する。
トレース種別７５２が「ｆｕｎｃ  ｅｎｔｒｙ」または「ｉｎｔ  ｅｎｔｒｙ」である場合、実行時間算出部１６３は、ＲＡＭ９１４を用いて、実行時刻７５１とトレースパラメータ７５３とを、実行中リストの末尾に追加して記憶する。
トレース種別７５２が「ｆｕｎｃ  ｅｘｉｔ」または「ｉｎｔ  ｅｘｉｔ」である場合、実行時間算出部１６３は、ＣＰＵ９１１を用いて、記憶した実行中リストの末尾から実行時刻とトレースパラメータとを取り出し、取り出したトレースパラメータがトレースパラメータ７５３と一致すれば、実行中リストの末尾から取り出した実行時刻とトレースパラメータとを実行中リストから取り除く。実行時間算出部１６３は、ＣＰＵ９１１を用いて、実行時刻７５１と、取り出した実行時刻との差を算出し、実行時間とする。実行時間算出部１６３は、記憶した実行中リストに含まれる実行時刻それぞれに、算出した実行時間を加算する。これにより、あるプログラムブロックの実行中に他のプログラムブロックや割込処理を実行した場合、他のプログラムブロックなどの実行にかかった時間を除き、実質的にそのプログラムブロックの実行にかかった時間を算出できる。実行時間算出部１６３は、ＣＰＵ９１１を用いて、トレース種別７５２が「ｆｕｎｃ  ｅｘｉｔ」である場合、トレースパラメータ７５３を関数名とし、算出した実行時間を実質実行時間として、磁気ディスク装置９２０を用いて、実行時間データに追加して記憶する。
【００７９】
総実行時間算出部１６４は、ＣＰＵ９１１を用いて、実行時間算出部１６３が生成した実行時間データを入力し、入力した実質実行時間データに基づいて、関数名と、実質実行時間とを取得する。実行時間算出部１６３は、ＣＰＵ９１１を用いて、取得した関数名が表わすプログラムブロックについて総実行時間を記憶しているか判定し、記憶していないと判定した場合、ＲＡＭ９１４を用いて、取得した実質実行時間を、そのプログラムブロックについての総実行時間として記憶する。実行時間算出部１６３は、ＣＰＵ９１１を用いて、取得した関数名が表わすプログラムブロックについて総実行時間を既に記憶していると判定した場合、ＣＰＵ９１１を用いて、取得した実質実行時間を、記憶したそのプログラムブロックについての総実行時間に加算し、ＲＡＭ９１４を用いて記憶する。すべての実行時間データについての処理が終了したのち、総実行時間算出部１６４は、ＣＰＵ９１１を用いて、記憶した総実行時間を総実行時間７６５として含む総実行時間データ７８５を生成する。
【００８０】
実行回数算出部１６２は、ＣＰＵ９１１を用いて、実行ログ取得部１５０が取得した実行ログ７５０に基づいて、実行回数データ７８６を生成する。
実行回数データ７８６には、例えば、関数名７６１、実行回数７６６などのデータが含まれる。
関数名７６１は、総実行時間データ７８５に含まれる関数名７６１と同様である。
実行回数７６６は、そのプログラムブロックの実行回数を表わす数値データである。
【００８１】
例えば、実行回数算出部１６２は、ＣＰＵ９１１を用いて、実行ログ取得部１５０が取得した実行ログ７５０を一行ずつ入力し、入力した実行ログ７５０に基づいて、トレース種別７５２、トレースパラメータ７５３を取得する。実行回数算出部１６２は、ＣＰＵ９１１を用いて、取得したトレース種別７５２に基づいて、トレース種別７５２が「ｆｕｎｃ  ｅｎｔｒｙ」であるか判定する。実行回数算出部１６２は、ＣＰＵ９１１を用いて、トレース種別７５２が「ｆｕｎｃ  ｅｎｔｒｙ」であると判定した場合、トレースパラメータ７５３が表わすプログラムブロックの実行回数を一つ増やし、ＲＡＭ９１４を用いて記憶する。すべての実行ログ７５０についての処理が終了したのち、実行回数算出部１６２は、ＣＰＵ９１１を用いて、記憶した実行回数を実行回数７６６として含む実行回数データ７８６を生成する。
【００８２】
作業優先度算出部１６９は、ＣＰＵ９１１を用いて、総実行時間算出部１６４が生成した総実行時間データ７８５と、実行回数算出部１６２が生成した実行回数データ７８６と、難易度予測部１６８が生成した難易度データ７８４とに基づいて、判定結果７３０を生成する。
判定結果７３０には、例えば、関数名７３１、難易度データ７３２、作業優先度データ７３３などのデータが含まれる。
関数名７３１は、難易度データ７８４、総実行時間データ７８５、実行回数データ７８６に含まれる関数名７６１と同様、プログラムブロックの名称を表わす文字列データである。
難易度データ７３２は、そのプログラムブロックの最適化難易度を表わす数値データである。この例では、数値が小さいほどそのプログラムブロックの最適化が難しいことを表わす。
作業優先度データ７３３は、そのプログラムブロックの作業優先度を表わす数値データである。この例では、数値が大きいほどそのプログラムブロックの最適化作業の優先度が高いことを表わす。
【００８３】
例えば、作業優先度算出部１６９は、ＣＰＵ９１１を用いて、難易度予測部１６８が生成した難易度データ７８４と、総実行時間算出部１６４が生成した総実行時間データ７８５と、実行回数算出部１６２が生成した実行回数データ７８６とを入力し、関数名７６１と、最適化難易度７６４と、総実行時間７６５と、実行回数７６６とを取得する。作業優先度算出部１６９は、ＣＰＵ９１１を用いて、同じプログラムブロックについて、最適化難易度７６４と実行回数データ７８６とに基づいて、最適化難易度７６４と実行回数データ７８６との積を算出し、作業優先度とする。これにより、実行回数の多いプログラムブロックは作業優先度が高くなり、最適化難易度が高いプログラムブロックは作業優先度が低くなる。作業優先度算出部１６９は、ＣＰＵ９１１を用いて、取得した総実行時間７６５に基づいて、作業優先度補正値を算出し、算出した作業優先度補正値を、算出した作業優先度に加算する。これにより、総実行時間に応じた作業優先度を算出できる。作業優先度算出部１６９は、ＣＰＵ９１１を用いて、算出した作業優先度を表わす作業優先度データを生成し、生成した作業優先度データを作業優先度データ７３３として含み、取得した最適化難易度７６４を難易度データ７３２として含む判定結果７３０を生成する。
【００８４】
判定結果表示部１７０は、ＣＰＵ９１１を用いて、作業優先度算出部１６９が生成した判定結果７３０を入力し、入力した判定結果７３０に基づいて、関数名７３１、難易度データ７３２、作業優先度データ７３３を取得する。判定結果表示部１７０は、ＣＰＵ９１１を用いて、入力した判定結果７３０を、取得した作業優先度データ７３３に基づいて、作業優先度データ７３３が表わす作業優先度が高い順に並べ替え、表示装置９０１を用いて表示する。
【００８５】
この実施の形態における最適化箇所判定装置１００は、データを記憶する記憶装置（磁気ディスク装置９２０、ＲＡＭ９１４など）と、データを処理する処理装置（ＣＰＵ９１１）と、ソース記憶部１１０と、ソース解析部１２０と、トレース挿入部１３０と、実行モジュール生成部１４０と、最適化箇所判定部１６０とを有する。
上記ソース記憶部１１０は、上記記憶装置（磁気ディスク装置９２０）を用いて、対象となる対象プログラムのソースコード７１０を記憶する。
上記ソース解析部１２０は、上記処理装置（ＣＰＵ９１１）を用いて、上記ソース記憶部１１０が記憶したソースコード７１０に基づいて、上記対象プログラムのプログラム構造を解析する。
上記トレース挿入部１３０は、上記処理装置（ＣＰＵ９１１）を用いて、上記ソース解析部１２０が解析したプログラム構造に基づいて、上記対象プログラムの実行状況（実行ログ７５０）を記録するトレース命令を、上記ソース記憶部１１０が記憶したソースコード７１０に挿入する。
上記実行モジュール生成部１４０は、上記処理装置（ＣＰＵ９１１）を用いて、上記トレース挿入部１３０がトレース命令を挿入したソースコード７１０に基づいて、実行装置８２１が実行できる形式の実行モジュール（動態測定用モジュール）を生成する。
上記最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記実行モジュール生成部１４０が生成した実行モジュール（動態測定用モジュール）を上記実行装置８２１が実行することにより上記トレース挿入部１３０が挿入したトレース命令を上記実行装置８２１が実行して上記実行装置８２１が記録した実行状況（実行ログ７５０）に基づいて、上記ソース解析部１２０が解析したプログラム構造に基づいて上記ソース記憶部１１０が記憶したソースコードを分割した複数のプログラムブロック（関数）のうちから、上記ソースコード７１０を改善すべきプログラムブロックを判定する。
【００８６】
この実施の形態における最適化箇所判定装置１００によれば、実行モジュール生成部１４０が生成した実行モジュールを実行装置８２１が実行することにより記録した実行状況に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当てて、有効活用することができる。
【００８７】
この実施の形態における最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記複数のプログラムブロックそれぞれについて、上記ソースコード７１０を改善することにより得られる上記対象プログラムの性能向上の効果を予測し、予測した性能向上の効果に基づいて、上記ソースコード７１０を改善すべきプログラムブロックを判定する。
【００８８】
この実施の形態における最適化箇所判定装置１００によれば、プログラムブロックのソースコード７１０を改善することによる対象プログラムの性能向上の効果を最適化箇所判定部１６０が予測し、予測した性能向上の効果に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、対象プログラムの性能向上の効果が高いプログラムブロックの最適化作業に割り当てて、有効活用することができる。
【００８９】
この実施の形態における最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記実行装置８２１が記録した実行状況に基づいて、上記複数のプログラムブロックそれぞれについて、上記プログラムブロックが実行された実行回数を算出し、算出した実行回数が多いほど性能向上の効果が高いものとして、上記対象プログラムの性能向上の効果を予測する。
【００９０】
この実施の形態における最適化箇所判定装置１００によれば、最適化箇所判定部１６０が、実行回数の多いプログラムブロックほど、ソースコード７１０の改善による対象プログラムの性能向上の効果が高いと判定するので、プログラムブロックのソースコード７１０の改善による性能向上の効果を予測する予測精度を高めることができ、限られた開発者資源を、有効活用することができる。
【００９１】
この実施の形態における最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記複数のプログラムブロックそれぞれについて、上記ソースコード７１０を改善する作業の難易度を予測し、予測した作業の難易度に基づいて、上記ソースコード７１０を改善すべきプログラムブロックを判定する。
【００９２】
この実施の形態における最適化箇所判定装置１００によれば、プログラムブロックのソースコード７１０を改善する作業の難易度を最適化箇所判定部１６０が予測し、予測した難易度に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、ソースコード７１０の改善作業が容易なプログラムブロックに割り当てて、有効活用することができる。
【００９３】
また、最適化箇所判定装置１００が、予測した難易度を出力する構成とすれば、難しい作業にはスキルの高い開発者を、やさしい作業にはスキルを低い開発者を割り当てるなど、開発者のスキルに応じた作業割り当てが可能となり、開発者資源を更に有効活用できる。
【００９４】
この実施の形態における最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記ソース解析部１２０が解析したプログラム構造に基づいて、上記プログラムブロックの規模を算出し、算出した規模が小さいほど作業の難易度が高いものとして、上記ソースコード７１０を改善する作業の難易度を予測する。
【００９５】
この実施の形態における最適化箇所判定装置１００によれば、最適化箇所判定部１６０が、規模の小さいプログラムブロックほど、ソースコード７１０を改善する作業が難しいと判定するので、プログラムブロックの最適化作業の難易度を予測する予測精度を高めることができ、限られた開発者資源を有効活用することができる。
【００９６】
この実施の形態における最適化箇所判定部１６０は、上記処理装置（ＣＰＵ９１１）を用いて、上記ソース解析部１２０が解析したプログラム構造に基づいて、上記プログラムブロックの構造の複雑さ（複雑度）を算出し、算出した構造の複雑さが単純であるほど作業の難易度が高いものとして、上記ソースコード７１０を改善する作業の難易度を予測する。
【００９７】
この実施の形態における最適化箇所判定装置１００によれば、最適化箇所判定部１６０が、構造が単純なプログラムブロックほど、ソースコード７１０を改善する作業が難しいと判定するので、プログラムブロックの最適化作業の難易度を予測する予測精度を高めることができ、限られた開発者資源を有効活用することができる。
【００９８】
この実施の形態における最適化箇所判定システム８２０は、最適化箇所判定装置１００と、上記実行モジュール生成部１４０が生成した実行モジュール（動態測定用モジュール）を実行する実行装置８２１とを有する。
【００９９】
この実施の形態における最適化箇所判定システム８２０によれば、実行モジュール生成部１４０が生成した実行モジュールを実行装置８２１が実行することにより記録した実行状況に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当てて、有効活用することができる。
【０１００】
この実施の形態における最適化箇所判定装置１００は、コンピュータを最適化箇所判定装置１００として機能させるコンピュータプログラムを、コンピュータが実行することにより、実現可能である。
【０１０１】
この実施の形態における最適化箇所判定装置１００として、コンピュータを機能させることを特徴とするコンピュータプログラムによれば、実行モジュール生成部１４０が生成した実行モジュールを実行装置８２１が実行することにより記録した実行状況に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当てて、有効活用することができる最適化箇所判定装置１００を実現することができる。
【０１０２】
この実施の形態における最適化箇所判定装置１００が、対象プログラムの最適化箇所を判定する最適化箇所判定方法は、以下の工程を有する。
上記処理装置（ＣＰＵ９１１）が、上記対象プログラムのソースコード７１０に基づいて、上記対象プログラムのプログラム構造を解析する。
上記処理装置（ＣＰＵ９１１）が、解析したプログラム構造に基づいて、上記対象プログラムの実行状況（実行ログ７５０）を記録するトレース命令を、上記ソースコード７１０に挿入する。
上記処理装置（ＣＰＵ９１１）が、上記トレース命令を挿入したソースコードに基づいて、実行装置８２１が実行できる形式の実行モジュール（動態測定用モジュール）を生成する。
上記実行装置８２１が、上記最適化箇所判定装置１００が生成した実行モジュールを実行することにより、上記最適化箇所判定装置１００が挿入したトレース命令を実行して、上記対象プログラムの実行状況（実行ログ７５０）を記録する。
上記処理装置（ＣＰＵ９１１）が、解析したプログラム構造に基づいて上記対象プログラムのソースコード７１０を分割した複数のプログラムブロックのうちから、上記実行装置８２１が記録した実行状況（実行ログ７５０）に基づいて、上記ソースコード７１０を改善すべきプログラムブロックを判定する。
【０１０３】
この実施の形態における最適化箇所判定方法によれば、最適化箇所判定装置１００が生成した実行モジュールを実行装置８２１が実行することにより記録した実行状況に基づいて、ソースコード７１０を改善すべきプログラムブロックを判定するので、限られた開発者資源を、高い性能改善効果を得られるプログラムブロックの最適化作業に割り当てて、有効活用することができる。
【０１０４】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、以下の構成を有する。
静的解析部（ソース解析部１２０、静的解析部１６５）は、入力されたソースプログラム（ソースコード７１０）に記述された内容を字句解析し、関数の構造に関するパラメータ、またはメトリクス値を抽出し、抽出した値のテーブルを関数ごとに記録する、関数構造情報（解析結果データ７４０、規模データ７８２、複雑度データ７８３など）を出力する。
トレース挿入部１３０は、静的解析によって得られた関数構造情報（解析結果データ７４０）をもとに、関数の実行履歴を取得するために必要なトレース命令をソースコード７１０中に埋め込む。なお、関数構造情報（解析結果データ７４０）を用いず、コンパイラとの連携等により、トレース挿入部１３０が、独自にトレース命令を挿入してもよい。
動態測定用モジュール（実行モジュール）は、トレース挿入部１３０によってトレース命令が埋め込まれたソースコードをコンパイル、リンク等の処理を経て、対象装置（実行装置８２１）上で実行可能な形式にしたものである。また、必要に応じて、ＯＳやミドルウェアなどのシステムソフトウェアに対してもトレース命令を設定し、タスクやスレッドのコンテキストスイッチや割込みなど、関数の実行をプリエンプトする処理についてもトレース可能にしておく。チューニング対象となるソフトウェアが搭載される装置（実行装置８２１）上で動態測定用モジュールを実行し、実行履歴記録部（トレース命令を実行した実行装置８２１）によって、実行ログ情報（実行ログ７５０）が保存される。
動的解析部１６１では、チューニング対象装置（実行装置８２１）で記録された実行ログ情報（実行ログ７５０）を解析し、関数毎の呼出し回数、総実行時間を集計してテーブルを作成し、関数実行情報（総実行時間データ７８５、実行回数データ７８６など）として出力する。
性能チューニング候補判定部（作業優先度算出部１６９）では、関数構造情報、関数実行情報、および性能統計情報（難易度テーブル７７０など）を入力し、各々のパラメータを用いて改善余地、難易度、コスト、改善効果等を判断するアルゴリズムによって関数を評価し、その結果、性能チューニング対象関数情報（判定結果７３０）を出力する。
【０１０５】
以上説明した静的解析部（ソース解析部１２０、静的解析部１６５）は、以下の処理をする。
静的解析部（ソース解析部１２０及び静的解析部１６５）は、ソースプログラム（ソースコード７１０）を入力し、一般的に確立された手段によって静的解析処理をして、関数（プログラムブロック）ごとにソースプログラム（ソースコード７１０）中の開始行番号および終了行番号、複数のｒｅｔｕｒｎ文に対応した位置リスト、コメントや空行を除いた実行命令行数から求められるメトリクスである関数規模、分岐命令による実行経路やループ構造から求められるメトリクスである複雑度などを抽出する。
静的解析部（ソース解析部１２０及び静的解析部１６５）は、抽出した情報に、関数名、ファイルパスなどを追加し、テーブル形式で出力する。
【０１０６】
以上説明したトレース挿入部１３０は、以下の処理をする。
トレース挿入部１３０は、ソースプログラム（ソースコード７１０）と関数構造情報（解析結果データ７４０）とを入力する。トレース挿入部１３０は、入力したソースプログラムに対し、入力した関数構造情報（解析結果データ７４０）のなかから、特に開始行番号、終了行番号、およびｒｅｔｕｒｎ文位置リストを参照して、関数内の処理の入口と出口となる位置に、実行ログ７５０を取得するために必要となるパラメータを与えたトレース命令を挿入する。トレース挿入部１３０は、トレースが挿入されたプログラムを、一旦中間ファイルとして保存する。
その後、実行モジュール生成部１４０が、コンパイラ、リンカ等の外部プログラムによって、中間ファイルを処理することで、ターゲット上での実行形式である動態測定用モジュールを生成する。
【０１０７】
以上説明した実行履歴記録部（実行装置８２１）は、以下の処理をする。
チューニング対象装置（実行装置８２１）は、トレース挿入部１３０の処理によって生成された動態測定用モジュールを、ダウンロードして実行する。その際、挿入された関数の入口および出口のポイントにおいて、トレース命令の呼び出しが行われる。トレース命令には、どの事象によるものなのかを識別するためのパラメータが与えられており、実行装置８２１は、タイマカウンタ等により現在の時刻を取得し、パラメータとセットにして記録することにより、図３のような形式で実行ログ情報（実行ログ７５０）を出力する。
【０１０８】
以上説明した動的解析部１６１は、以下の処理をする。
動的解析部１６１は、実行コンテキスト毎にログを分離して、共通的に呼ばれる関数の入口と出口の対応を明確にする。動的解析部１６１は、関数出口のトレース時刻から関数入口のトレース時刻を差し引き、さらに他のタスクやスレッド、割り込みハンドラにプリエンプトされた時間も差し引くことにより、関数本来の処理に費やした時間を計算し、それを関数毎に累計する。また、動的解析部１６１は、関数が呼び出された回数を関数ごとに累計する。動的解析部１６１は、このようにして分析した関数の実行情報を出力する。
【０１０９】
以上説明した性能チューニング候補判定部（難易度予測部１６８、作業優先度算出部１６９）は、以下の処理をする。
性能チューニング候補判定部（難易度予測部１６８）は、使用するデータ（関数構造情報、関数実行情報、性能統計情報など）を入力する。性能チューニング候補判定部は、まず関数構造情報（解析結果データ７４０）の終了行番号から開始行番号を引き、各々の関数の関数規模を計算する。そして、その関数規模に対応する改善指標値（最適化難易度）を、性能統計情報（難易度テーブル７７０）を用いて求める。
性能チューニング候補判定部（作業優先度算出部１６９）は、求めた改善指標値に、関数実行情報（実行回数データ７８６）の実行回数を掛けることで、改善効率指標値を算出する。
その後、関数実行情報（判定結果７３０）に対し、判定結果表示部１７０は、改善効率指標値の高い関数（プログラムブロック）から順番に並ぶようにソートし、その結果を性能チューニング対象関数情報（判定結果７３０）として出力する。この性能チューニング対象関数情報の順位が上位ものは、チューニングの余地があり、またチューニングによる効果が得られやすいという判断材料になる。
なお、作業優先度算出部１６９は、入力される関数構造情報と関数実行情報に含まれる各々のパラメータの組み合わせによって、様々な基準の改善指標値を導きだし、それを加味することで精度向上を図ることが可能である。
【０１１０】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、
ソースプログラム（ソースコード７１０）の記述内容の構文解析を行うことで関数の構造情報を抽出する静的解析部（ソース解析部１２０、静的解析部１６５）と、関数（プログラムブロック）の実行情報を得るために必要なトレース命令を関数の構造に従って挿入するトレース挿入部１３０と、チューニング対象装置（実行装置８２１）で取得したログ（実行ログ７５０）を解析して関数実行情報を抽出する動的解析部１６１と、入力された関数の構造情報と実行情報から、性能統計情報（難易度テーブル７７０など）にしたがって性能チューニング（最適化作業）の対象となる関数を選出する性能チューニング候補判定部（作業優先度算出部１６９）とを備える情報処理装置（最適化箇所判定装置１００）と、
前記情報処理装置（最適化箇所判定装置１００）によるトレース命令を含んだ動態測定用モジュールを実行することで得られる実行履歴を記録して実行ログ情報を出力する実行履歴記録部を備えたチューニング対象装置（実行装置８２１）とを有する。
【０１１１】
このように、実際にプログラムを動かして得られる動的解析結果である関数の実行情報と、プログラムの静的解析によって得られる関数の構造情報とを組み合わせて分析することによって、処理時間のかかっている箇所のリストではなく、効果と難易度に判断基準をおいた性能チューニング箇所の候補リストを得ることができる。ここで、難易度とは、チューニングを行うための余地を静的解析によって判定したもので、例えば、実際に処理時間がかかっていたとしても、規模が小さくて構造が単純な関数に対してチューニングを施すのは一般的に難しいと判断される。最適化箇所判定システム８２０によって得られる性能チューニング箇所の候補をもとに、開発者のスキルに応じてチューニング作業を振り分けて実施すれば、高い性能改善効果を短時間で得ることが期待できる。
【０１１２】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、
性能チューニング候補判定部（作業優先度算出部１６９）が、静的解析結果に基づく関数構造情報と、動的解析結果に基づく関数実行情報とを組み合わせ、性能統計情報（難易度テーブル７７０など）を用いて評価することで、構造的なチューニングの難易度と、動態に基づく改善効果を予測し、その結果に基づいて性能チューニング対象関数情報を生成する。
【０１１３】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、
関数構造情報として、関数の開始点／終了地点、命令ライン数、ループ／分岐ブロックの種別と開始／終了地点、関数呼出し関係、その他静的解析によって抽出可能な情報を保持する。
【０１１４】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、
関数実行情報として、実行時間、呼出し回数、呼出し関係、ループ回数、通過経路、その他実行ログ情報の解析によって抽出可能な情報を保持する。
【０１１５】
以上説明したプログラム最適化箇所自動判定システム（最適化箇所判定システム８２０）は、
性能統計情報として、関数構造情報や関数実行情報の各パラメータについて、性能改善の余地、難易度、コスト、パラメータ間の相関関係等について、データ構造または評価関数によって表現したものを保持する。
【０１１６】
以上により、チューニングによる改善効果が見込める箇所の自動的な絞り込みが可能になり、性能改善効果が得られる確率を向上させることができる。このようにして得られた性能チューニング対象関数情報（判定結果７３０）をもとに、上位にランキングされた関数から順次チューニングを実施することで、単なる実行時間順の関数リストを用いた場合に比べて、短い時間で大きな改善効果を得やすくなる。これは、チューニング作業の効率は、時間がかかっている処理であっても性能改善効果が必ず得られるかどうかは不確定であり、それよりも対象とする処理の構造に強く依存するという特性を持っているためである。
【図面の簡単な説明】
【０１１７】
【図１】実施の形態１におけるプログラム最適化システム８００の全体構成の一例を示すシステム構成図。
【図２】実施の形態１における最適化箇所判定装置１００の外観の一例を示す図。
【図３】実施の形態１における最適化箇所判定装置１００のハードウェア資源の一例を示す図。
【図４】実施の形態１における最適化箇所判定システム８２０の構成の一例を示すブロック構成図。
【図５】実施の形態１における最適化箇所判定装置１００が最適化箇所を判定する最適化箇所判定処理の流れの一例を示すフローチャート図。
【図６】実施の形態１におけるソース解析部１２０が生成する解析結果データ７４０の一例を示す図。
【図７】実施の形態１における実行装置８２１が動態測定用モジュールを実行して、生成する実行ログ７５０の一例を表わす図。
【図８】実施の形態１における最適化箇所判定部１６０の内部ブロックの構成の一例を示す詳細ブロック図。
【図９】実施の形態１における最適化箇所判定部１６０が、最適化箇所を判定する最適化箇所判定工程Ｓ５１６の詳細な処理の流れの一例を示すフローチャート図。
【図１０】実施の形態１における最適化箇所判定部１６０が生成する各種データの一例を表わす図。
【図１１】実施の形態１における最適化箇所判定部１６０が生成する各種データの一例を表わす図。
【符号の説明】
【０１１８】
１００  最適化箇所判定装置、１１０  ソース記憶部、１２０  ソース解析部、１３０  トレース挿入部、１４０  実行モジュール生成部、１５０  実行ログ取得部、１６０  最適化箇所判定部、１６１  動的解析部、１６２  実行回数算出部、１６３  実行時間算出部、１６４  総実行時間算出部、１６５  静的解析部、１６６  規模算出部、１６７  複雑度算出部、１６８  難易度予測部、１６９  作業優先度算出部、１７０  判定結果表示部、７１０  ソースコード、７２０  評価結果、７３０  判定結果、７３１，７４１，７６１  関数名、７３２  難易度データ、７３３  作業優先度データ、７４０  解析結果データ、７４２  パス名、７４３  開始行番号、７４４  終了行番号、７４５  リターン行番号リスト、７５０  実行ログ、７５１  実行時刻、７５２  トレース種別、７５３  トレースパラメータ、７６２  規模、７６３  複雑度、７６４  最適化難易度、７６５  総実行時間、７６６  実行回数、７７０  難易度テーブル、７７１  規模上限、７７２  難易度、７８２  規模データ、７８３  複雑度データ、７８４  難易度データ、７８５  総実行時間データ、７８６  実行回数データ、８００  プログラム最適化システム、８１０  性能評価システム、８２０  最適化箇所判定システム、８２１  実行装置、８２２  実行モジュール記憶装置、８２３  実行ログ記憶装置、８３０  ソース作成装置、９０１  表示装置、９０２  キーボード、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ装置、９０７  スキャナ装置、９１０  システムユニット、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信装置、９２０  磁気ディスク装置、９２１  ＯＳ、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群、９３１  電話器、９３２  ファクシミリ機、９４０  インターネット、９４１  ゲートウェイ、９４２  ＬＡＮ、９５０  開発者、９６０  管理者。
【図１】
2009211424.tif 000003
【図２】
2009211424.tif 000004
【図３】
2009211424.tif 000005
【図４】
2009211424.tif 000006
【図５】
2009211424.tif 000007
【図６】
2009211424.tif 000008
【図７】
2009211424.tif 000009
【図８】
2009211424.tif 000010
【図９】
2009211424.tif 000011
【図１０】
2009211424.tif 000012
【図１１】
2009211424.tif 000013