(57)【要約】【課題】  階層的に構成されたモジュール又は関数からなるソフトウェアアプリケーションをプロファイリングする技術を提供する。【解決手段】  ソフトウェアアプリケーションをプロファイリングする方法は、選択されたサブセットの関数群のみにプロファイリングフックを用いる反復的なコンパイル処理（ＳＴ２０）である。この処理は、コールグラフ内の異なる階層レベルにある関数群を順次にサブセットに追加して、これらの関数についてだけプロファイリングを実行し（ＳＴ２２、ＳＴ２４）、更なる処理及び／又は最適化に最も重要な関数群のサブセットを残すように、不要な関数を除去する（ＳＴ２６、ＳＴ２８）。【選択図】  図２
2011248895.tif 000002
【特許請求の範囲】
【請求項１】
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングする方法であって、
コンピュータにより
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む、方法。
【請求項２】
前記分類するステップは更に、前記複数の関数のコールグラフを決定することを有し、
前記サブセットを縮小するステップは更に、前記除去された関数及び前記選外関数を前記コールグラフから消去することを有すること特徴とする請求項１記載の方法。
【請求項３】
前記分類するステップに先立って、プロファイリングメトリックを選択し、且つプロファイリングコードを用いずに前記ソフトウェアアプリケーションを実行することで、選択されたメトリックの基準値を確立するステップを更に有することを特徴とする、請求項１又は２に記載の方法。
【請求項４】
前記サブセットを縮小するステップは、関数を、それに関連するプロファイリングデータが前記プロファイリングメトリックに関する所定の条件を満たすか否かに基づいて除去することを含む、こと特徴とする請求項３に記載の方法。
【請求項５】
前記サブセットを縮小するステップは、前記プロファイリングメトリックに従って、プロファイリングされた関数をランク付けすることを含み、前記所定の条件は前記基準値のうちの所与の割合である、こと特徴とする請求項４に記載の方法。
【請求項６】
前記プロファイリングメトリックは、実行時間、メモリ使用状況、ディスク使用状況、及びハードウェアカウンタに基づくメトリックのうちの少なくとも１つである、こと特徴とする請求項５に記載の方法。
【請求項７】
前記所定の階層レベルは前記最下位レベルである、こと特徴とする請求項１乃至６の何れか一項に記載の方法。
【請求項８】
前記所定の階層レベルは、目標とする数又は割合の関数が選外となるか、除去されることになった階層レベルである、こと特徴とする請求項１乃至６の何れか一項に記載の方法。
【請求項９】
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションを自動的にプロファイリングする装置であって、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するように構成されたコード分析ユニットと、
現在レベルにおける関数群のサブセットを記録するように構成された関数記憶ユニットと、
前記サブセットの関数群の各々に対してプロファイリングコードを付加あるいは有効化するように構成されたインスツルメンテーションユニットと、
前記ソフトウェアアプリケーションを実行して、プロファイリングデータを生成するように構成された実行ユニットと、
前記実行ユニットによって生成されたプロファイリングデータを保持するプロファイルデータ記憶ユニットと、
前記プロファイリングデータに基づいて関数を消去し、且つ消去された関数によってのみ呼び出される関数を除いた前記現在レベルの下の次レベルからの関数を記録するよう、前記関数記憶ユニットに命令するように構成された関数選択ユニットと、
を含み、
前記インスツルメンテーションユニット、前記実行ユニット、前記プロファイルデータ記憶ユニット、及び前記関数選択ユニットは、所定の階層レベルに到達するまで繰り返し動作するように構成される、
装置。
【請求項１０】
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングさせるプログラムであって、コンピュータに、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記サブセットから関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む処理を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はソフトウェアアプリケーションのプロファイリングに関する。
【背景技術】
【０００２】
最新のソフトウェアアプリケーションは、数多くの相互作用モジュールを有し、高度に複雑である。一例に係る海洋モデリングアプリケーション及びそれに関連するライブラリは、３１，８１０もの関数（ファンクション）で構成されている。ソフトウェアアプリケーションが大規模且つ複雑になるにつれ、アプリケーションの迅速且つ効率的な実行（“最適化”と呼ぶ）を確保することがますます重要になる。“プロファイリング”は、例えば時間及びメモリ空間などのリソースを非常に多く消費するのがアプリケーションのどの部分であるかを決定することによって最適化を支援する技術を意味する。具体的には、コードを書き換えること、メモリ内のコードのブロックを移動させること、又はソフトウェアアプリケーションの部分の実行順序を変更することによって改善を可能にし得るようなボトルネックが特定され得る。
【０００３】
プロファイリングを行う際には、ソフトウェアアプリケーションを、該アプリケーションの通常使用を表す一組の典型的な入力条件の下で実行する。アプリケーションが実行されるとき、データが何らかの方法で収集される。ソフトウェアプロファイリングの方法には主にサンプリング及びインスツルメンテーション（計装；instrumentation）という２つの方法が存在する。サンプリングは、規則的な間隔（インターバル）でアプリケーションに割り込むことによって統計情報を集めるとともに、コール（呼び出し）スタックを調べ、各インターバルにおいて実行中のコード部分のスナップショットを提供する。この技術は、比較的小さい追加処理のオーバヘッドのみを必要とするが、サンプリング間隔が長くなるにつれて正確さを欠いたものとなる。インスツルメンテーションは、アプリケーションが或る関数に出入りする時を記録する“プロファイリングフック（profiling  hook）”と呼ばれるソースコードをアプリケーションに付加する。インスツルメンテーションは、例えば或る関数に対して為される呼び出しの正確な回数などについて、サンプリングより良好な情報を提供するが、追加処理のオーバヘッドを生じさせ、ソフトウェアアプリケーションの全体の実行を遅くさせるとともに、アプリケーションの複数の部分間のタイミング関係を変えてしまう可能性がある。さらに、インスツルメンテーションは、より多くのデータを生成し、大規模なアプリケーション内の全ての関数に使用するわけにはいかない。このようにインスツルメンテーションが付加されたソフトウェアアプリケーションを、“計装（instrumented）”アプリケーションと呼ぶ。
【０００４】
典型的に、大規模ソフトウェアアプリケーションは、多数の相互作用部分又は“関数”（これらは、状況に応じて、“モジュール”、“ルーチン”、サブルーチン又はコードブロックと呼ばれることもある）からなる。故に、インスツルメンテーションに適用される場合に、インスツルメンテーションによって引き起こされる変化、及び莫大な量のデータが生成されることは、このような大規模なアプリケーション内の全ての関数に問題を生じさせる。
【０００５】
大規模ソフトウェアアプリケーションにおいて、関数群は階層構造を有し、一部の関数は、特定のタスクの下位関数に依存しながら、より上位のタスクを担う。階層の最上部には、アプリケーションが開始して終了するメイン関数が存在する。アプリケーションの実行は通常、ユーザがオペレーティングシステムを介してコマンドを与えることによって開始される。アプリケーションの実行中、１つの関数が別の関数を呼び出し、該別の関数は更なる関数を呼び出すか呼び出した側の関数に実行を戻すかの何れかを行い得る。アプリケーションの最後において、メイン関数は制御をオペレーティングシステムに返す。
【０００６】
このような構造内の階層を見る一手法は、メイン関数からの関数呼び出し数に関するものである。故に、メイン関数の階層をレベル０としてＳ０とラベル付けすると、Ｓ０から直接的に呼び出されることができる関数、すなわち、単一関数呼び出しの距離の関数はレベル１であり、２関数呼び出しの距離の関数はレベル２であり、等々と続く。
【０００７】
インスツルメンテーションとして挿入される付加的な命令群は、実行がそれらに到達する度に記録を行わせる。典型的に、このような命令はモジュール又は関数の開始ポイント及び終了ポイントに付加される。斯くして、インスツルメンテーションは、どの関数がどの時点で呼び出されて総実行時間のうちのどれだけの割合が各関数で費やされたかの記録を提供することができる。このような記録は、人による分析のために何らかの方法で提示されなければならない。このような記録を提示する一手法は、関数群と各関数の実行に費やされた時間量とをリスト化した表として提示するものである。
【０００８】
別の一手法は、ツリー状の構造内のノードとして関数を表示する“コール（呼び出し）グラフ”を用いるものであり、ノード同士を結び付ける線（又は“エッジ”）が関数間の呼び出しを表す。別の関数を呼び出す関数は“発呼側（コーラー）”と呼ばれ、他方の関数は“被発呼側（コーリー）”である。被発呼側はしばしば、“親の”発呼側関数の“子”とも呼ばれる。一般に、ツリー内の高位側（換言すれば、階層内の上位側）の関数が、ツリー内の下方の関数を呼び出す。しかしながら、関数群は、下位側から上位側への呼び出しを有するように、あるいは関数がそれ自身を呼び出すように、複雑に相互作用してもよく、故に、親子関係は常に明確であるわけではない。
【０００９】
科学シミュレーションで使用されるデータセットは、典型的に非常に大きく、長大な時間にわたって実行され続ける（大規模なシミュレーションは、何百ものＣＰＵ上で並列に何時間も実行され得る）。これは、大規模並列アプリケーションについてアプリケーションプロファイリングを実行するときに２つの問題をもたらす：
（ｉ）大量のデータが生成される；
（ｉｉ）プロファイリングによって生じるオーバヘッドがタイミングを歪ませてしまい得る。
【００１０】
大規模アプリケーション内の全ての関数に計装プロファイリングが適用されるとき、生成されるデータ量が管理しきれないものとなり、且つ／或いは付加的な処理オーバヘッドがプロファイリング結果を無意味なものにしてしまう。典型的な解決策は、アプリケーションの選択された部分のみに手動でプロファイリングを適用することである。これは、アプリケーションプロファイリング技術に精通した人物によって行われなければならない、時間を消費する処理である。
【００１１】
従って、アプリケーション内の関数群のうちの重要なサブセット（部分集合）のみに計装プロファイリングを自動的に実行することが望まれる。
【００１２】
特許文献１は、サンプリング技術を用いるプロファイリングによって生成されるデータ量を、アプリケーションの標的重要部分に対してサンプリングレートを変えることによって削減する機構を開示している。しかしながら、サンプリング技術は、その性質上、計装プロファイリングより正確でなかったり目標とされなかったりする傾向にある。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】米国特許出願公開第２００８／２８２２３２号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１４】
上述のように、大規模ソフトウェアアプリケーションは、含まれる関数（ファンクション）数及び生成されるデータ量に起因して、プロファイリングすることが困難である。開示の機構は、時間を消費する人の介入の必要性を排除することによって、計装プロファイリングの処理を自動化して効率化するものである。
【課題を解決するための手段】
【００１５】
本発明の第１の態様によれば、メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングする方法が提供される。当該方法は、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む。
【００１６】
このプロセスは、人の介入なく自動的に実行されることができる。故に、本発明の一実施形態は、インスツルメンテーションによってプロファイリングする対象とすべきソフトウェアアプリケーション部分を定める自動化技術を提供し得る。
【００１７】
ここで、分類するステップは更に、前記複数の関数のコールグラフを少なくとも概念的に決定することを有していてもよく、前記サブセットを縮小するステップは更に、除去された関数及び選外関数をコールグラフから消去することを有していてもよい。それにより、前記繰り返すステップの最後の繰り返しで実行した後の結果が、最適化されたプロファイリングコールグラフとなる。
【００１８】
好ましくは、関数はコンパイル可能なコードの形態を有し、プロファイリングコードがコンパイラ又はプリプロセッサで付加されることを可能にする。代替的に、所望のサブセットの関数のみをプロファイリングするように、全ての関数に設けられたプロファイリングコードが選択的に有効化／無効化されてもよい。
【００１９】
また好ましくは、前記分類するステップに先立って、プロファイリングメトリックを選択し、且つプロファイリングコードを用いずにソフトウェアアプリケーションを実行することで、選択されたメトリックの基準値を確立するステップが存在する。
【００２０】
その場合、前記サブセットを縮小するステップは好ましくは、関数を、それに関連するプロファイリングデータがプロファイリングメトリックに関する所定の条件を満たすか否かに基づいて除去することを含む。
【００２１】
これは、所定の条件は基準値のうちの所与の割合であるとして、プロファイリングメトリックに従って、プロファイリングされた関数をランク付けすることを含むことができる。好ましくは、メトリックは、実行時間、メモリ使用状況、ディスク使用状況、及びハードウェアカウンタに基づくメトリックのうちの少なくとも１つである。
【００２２】
このプロセスの実行が完了する上記所定の階層レベルは好ましくは最下位レベルである。代替的に、このプロセスは、目標とする数又は割合の関数が選外となるか除去されるかしたときに停止されてもよい。
【００２３】
最適化されたプロファイリングコールグラフを生成する場合、これは好ましくはユーザに表示される。得られた結果は、所定の階層レベルに到達したときに得られたサブセットに含まれる関数のコードを自動あるいは手動で最適化するために使用され得る。
【００２４】
本発明の第２の態様によれば、メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションを自動的にプロファイリングする装置が提供される。当該装置は、
複数の関数の各々を、メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するように構成されたコード分析ユニットと、
現在レベルにおける関数群のサブセットを記録するように構成された関数記憶ユニットと、
サブセットの関数群の各々に対してプロファイリングコードを付加あるいは有効化するように構成されたインスツルメンテーションユニットと、
ソフトウェアアプリケーションを実行して、プロファイリングデータを生成するように構成された実行ユニットと、
実行ユニットによって生成されたプロファイリングデータを保持するプロファイルデータ記憶ユニットと、
プロファイリングデータに基づいて関数を消去し、且つ消去された関数によってのみ呼び出される関数を除いた現在レベルの下の次レベルからの関数を記録するよう、関数記憶ユニットに命令するように構成された関数選択ユニットと、
を含み、
インスツルメンテーションユニット、実行ユニット、プロファイルデータ記憶ユニット、及び関数選択ユニットは、所定の階層レベルに到達するまで繰り返し動作するように構成される。
【００２５】
本発明の第３の態様によれば、メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングさせるプログラムが提供される。当該プログラムは、コンピュータによって実行されるときに該コンピュータに、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記サブセットから関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む処理を実行させる。
【図面の簡単な説明】
【００２６】
以下の図を含む添付図面を単なる例として参照する。
【図１】従来手法における、ソフトウェアアプリケーションのコンパイル及び計装を行ってプロファイリングデータを生成するコンピュータシステムを模式的に示すブロック図である。
【図２】本発明に係る方法を示すフローチャートである。
【図３】関数群をランク分けしたソフトウェアアプリケーション例の完全コールグラフを示すコールグラフ図である。
【図４】処理の途中段階での本発明に係る方法を表す中間コールグラフを示す図である。
【図５】プロファイリングに重要な関数のみを含んだ最終的なコールグラフを示す図である。
【図６】異なる階層にある関数間で取り得る関係を示す図である。
【図７】本発明に係る方法における様々な繰り返しでのコールグラフ及び実行時間を示す図である。
【図８】本発明に係る方法を実行する装置を模式的に示す図である。
【発明を実施するための形態】
【００２７】
図１を参照するに、従来技術に従ったソフトウェアアプリケーション（以下、単に“プログラム”と呼ぶ）のコンパイル及び計装に伴う処理が模式図の形態で示されている。コンピュータシステム１は、プログラムを格納するメモリ１０（通常、ソリッドステートメモリに加えて、ハードディスク記憶装置の形態をとる）と、プログラム内の命令を実行するＣＰＵ２０とを有している。単純化のために単一のＣＰＵが示されているが、実際には、大規模ソフトウェアアプリケーションは何百又は何千といったＣＰＵ上で並列に実行され得る。
【００２８】
既に述べたように、プログラムは数多くの関数又はモジュールからなる。これらの各々は、一般的に、プログラマーが理解しやすい高級言語（ソースコード）で記述される。コンピュータシステム１のＣＰＵ２０によって実行されることが可能になる前に、各ソースモジュール１１は、コンパイラ１２にて、ＣＰＵ２０によって理解される機械語（オブジェクトコード）のレベルへとコンパイルされる（中間段階が含まれてもよいが、ここでは単純化のために省略する）。モジュールを計装するため、一般的にこのコンパイル段階に、付加的な命令（フック）の形態をしたインスツルメンテーション１３が適用される。しかしながら、インスツルメンテーションは、より前に（コンパイル前の前処理として）、あるいは後に（オブジェクトコードの変更によって）導入されてもよい。
【００２９】
得られたオブジェクトモジュール１４は、プログラムの機能を実行するために相互作用する多数のモジュールのうちの１つである。複数のオブジェクトモジュールを結び付けるため、及び標準コードのライブラリ１６に結びつくことによって下位関数を付加するため、リンカー１５が使用される。（これの一例は、Ｃプログラミング言語においてメモリを割り当てる下位関数であり、実行ファイルにリンクされたライブラリによって提供されるmalloc()及び関連する関数によって提供される。）ライブラリ自体がプロファイリング用フックを備えてもよい。
【００３０】
その結果、実行可能アプリケーション１７の形態をしたプログラムが得られる。この実行ファイルに含まれる機械語レベルの命令を実行することにより、ＣＰＵはプログラムを走らせて結果を生成する。具体的には、インスツルメンテーションコードが様々な関数間での呼び出しを監視するときに、計装プログラムはプロファイルデータ４０を生成する。
【００３１】
上述のように、プロファイリング指標（メトリック）の可能な限り多くを明らかにすることと過度に多くの情報を生成することとの間にバランスが存在する。これは、典型的に、アプリケーションの予備知識を用いて、プロファイリングすべきプログラムの領域を手動選択することによって、手作業で対処されるが、それは面倒で時間がかかり得るものである。
【００３２】
以下に説明する本発明を具現化する方法は、プロファイリングすべき最適な関数の組（関数セット）をどのようにして自動的に選択するかに関係する。それは、コールグラフ内の異なる階層レベルの関数群を順次組み込む反復的な処理であり、プロファイリングに最も重要な関数群のサブセットを残すように不要な関数群を除去するものである。
【００３３】
図２のフローチャートは、プロファイリングすべき最適な関数セットを生成するために使用される処理の概略を示している。この処理は計装されていないプログラムで開始すると仮定している。開始条件は、この方法で使用される“プロファイリングメトリック”を選択することを含む。これは、どの関数を含有あるいは排除すべきという形態の判断を決するための基準として使用されるパラメータである。典型的に、プロファイリングメトリックは時間であり、より具体的には、各関数（並びに、その子すなわち被発呼側関数）の実行によって占有される時間である。しかしながら、後述するように、その他の可能なプロファイリングメトリックも存在する。
【００３４】
以下にて列挙するステップ群の幾らかを実行するためにユーザによって操作される“プロファイリング装置”を参照することとする。これは、プログラムを実行するために使用されるものとは別個のコンピュータであってもよいし、あるいは、より一般的には、例えば図１のコンピュータシステム１などの実行コンピュータそれ自体であってもよい。故に、汎用コンピュータであっても、コード分析ユニット、関数記憶ユニット、インスツルメンテーションユニット、実行ユニット、プロファイルデータ記憶ユニット及び関数選択ユニットを含むプロファイリング装置として動作することができる。
【００３５】
本発明を具現化する方法は以下のステップを含む。
【００３６】
ＳＴ１０．  プロファイリングなしでプログラムをコンパイルする。これにより、計装されていないプログラム（非計装プログラム）が、実行コンピュータによって通常のように実行されることが可能になる。
【００３７】
ＳＴ１２．  非計装プログラムを実行することに基づいて、検討するプロファイリングメトリックの基準値を決定する。上述のように、プロファイリングメトリックは典型的に時間であり、その場合、基準値は、プロファイリングが行われないときに該プログラムが要する総時間とし得る。この基準値（又は、そのうちの或る割合）は、後の関数選択のための閾値として使用される。
【００３８】
ＳＴ１４．  実行ファイルを分析することによってコールグラフを決定する。これにより、図３に示すＣＧ１のような、全ての関数及びそれらの呼び出し関係を示すコールグラフが得られる。図３は、非常に単純な一例を示しており、関数群はメイン関数main()からの呼び出し数に従った階層レベルにランク分けされている。全ての呼び出し経路が実行中に辿られるわけではないので、このコールグラフは過剰なものである。この種のコールグラフを“静的コールグラフ”とも呼ぶ。
【００３９】
ＳＴ１６．  main()関数からの呼び出しステップ数に従って、関数群を複数の階層レベルにランク分けする。コールグラフに関して、これは、関数がメイン関数から幾つのエッジだけ離れているかと表現してもよい。図３に示すように、メイン関数Ｓ０又は()はコールグラフＣＧ１の先頭にあり、実行はここで開始して終了する。メイン関数は図３のレベル０を占有している。Ｓ０によって直接呼び出される関数群（すなわち、Ｓ０の被発呼側関数）がレベル１を形成する。第１レベル内の関数によって呼び出される関数群がレベル２を構成し、等々と続く。レベル２はレベル１の次レベルと呼ばれ、以下同様である。
【００４０】
或る関数が２つ以上の上位関数によって呼び出される場合、その関数のレベルは、メイン関数から数えた最小の呼び出し数によって決定される。一例として、図３の関数Ｓ８は、呼び出しに関して通り得る２つの経路：
経路１：Ｓ０→Ｓ３→Ｓ８
経路２：Ｓ０→Ｓ２→Ｓ７→Ｓ１３→Ｓ８
を有している。Ｓ８は図３のコールグラフではレベル２に示されている。レベル０から数えた最小の呼び出し数が２だからである。
【００４１】
ＳＴ１８．  プロファイリングされた関数のリストに第１レベルの関数を追加する。換言すれば、この最初の繰り返し（反復）において、レベル１内の全ての関数（図３では、Ｓ１、Ｓ２及びＳ３が存在）を含む関数リスト又は関数セット（以下では“サブセット”とも称する）が作成される。レベル１は、当該処理によって検討中の“現在レベル”となる。
【００４２】
ＳＴ２０．  適切なプロファイリングフックを用いてプログラムを再コンパイルする。すなわち、リスト内の関数のみにインスツルメンテーションコードが付加される（あるいは、有効にされる―以下参照）。システム依存問題に対処する、あるいは特別な機能（フィーチャ）をイネーブル／ディセーブルするよう、図１のコンパイラ１２、又はコンパイル前にソースコードを変更するプリプロセッサの何れかによるプロファイリングフックの自動挿入を用いて計装プロファイリングが実行される。
【００４３】
ＳＴ２２．  こうして再コンパイルされたプログラムを走らせ、プロファイリングデータを収集する。このプロファイリングデータは、当然ながら、リスト内の関数に限定されており、故に、サイズ的に比較的管理しやすいとともに、全体的なプログラム実行にあまり影響しない。
【００４４】
ＳＴ２４．  プロファイリングされた関数群をプロファイリングメトリックに従ってランク付ける。一例として時間を考えると、リスト内の関数群は、実行時間（その関数及びその被発呼側関数すなわち“子”関数を実行することによって占有される時間）の短い順（昇順）に並べられる。
【００４５】
ＳＴ２６．  メトリックの閾値割合に到達するまで、最小の関数を除去（“削除”）する。すなわち、例えば占有時間の約５％未満といった、メトリックの所与の割合より小さい割合を占める関数を取り除くことによって、リストが縮小される。以下では、これらを“被除去関数”と呼ぶ。また、これらの被除去関数によってのみ呼び出される関数を見出し、更なる検討から無視されるようにマークを付す。以下では、これらを“選外関数”と呼ぶ。
【００４６】
ＳＴ２８．  プロファイリングコールグラフから被除去関数及び選外関数を除去する。換言すれば、ＳＴ２６後に残った関数のみを含めることによって、コールグラフを更新する（ユーザに実際に表示されるか、あるいはプロファイリング装置内に単に概念的に存在するかに拘わらず）。留意すべきことには、これは、現在レベルから除去された関数だけでなく、被除去関数の１つ以上によってのみ呼び出されるものであることに基づいて退けられた下位レベルの関数をも除去する。すなわち、現在レベルの関数を除去することは、それより下位のレベルが再計算されることを可能にするとともに、メイン関数への経路をもはや有さない“孤児”関数が除去されることを可能にする。こうする理由は、プロファイリングオーバヘッドは、実行されるインスツルメンテーション呼び出しの数に比例し、数多くの短期間呼び出し関数は、プロファイリングメトリックのうちの大きな割合を占めることなくオーバヘッドに大きく影響するためである。結果として、図４のものと同様の縮小されたコールグラフが得られる（図４は後の処理段階を示している）。
【００４７】
ＳＴ３０．  プロファイリングされた関数のリストに次レベルの関数群を追加する。故に、最初の繰り返しにおいて、レベル２の残っている関数が、リスト内に依然としてあるレベル１の関数に追加される。
【００４８】
ＳＴ３２．  全ての関数がプロファイリング又は無視（除去／選外）の何れかを受けるまで、あるいは所定のレベルに到達するまで、ＳＴ２０からＳＴ２８を繰り返す。図３の単純な例においては、階層の最下位レベルであるＣＧ１のレベル３に到達するのに二度の反復で十分である。一般的に、処理を最下位レベルまで続けることが常に好ましい。しかしながら、大規模且つ複雑な現実の例においては、コールグラフ内に多数のレベルが存在し、必要な時間及び労力を低減するため、場合により更なる作業に先立って大まかな概略を得るために、プロファイリングは所定数の上位レベルに制限され得る。上記所定のレベルは、関数群のうちの所望の数又は割合が排除（選外あるいは除去）されることとなったレベルとしてもよい。
【００４９】
図４は、最初の２つのレベルがプロファイリングされた後にプロファイリングコールグラフがどのように見え得るかの一例として、更新されたコールグラフＣＧ２を示している。なお、Ｓ２はこの単純な例において唯一残っているレベル１の関数である。関数Ｓ１及びＳ３、並びにＳ１の子であるＳ４は、上述のステップＳＴ２８の最初の繰り返しで除去されている。さらに、関数Ｓ６が２回目の繰り返しにて除去されている。３番目のレベル２の関数Ｓ８は、下位関数Ｓ１３の被発呼側であるが故に単なるＳ３の子ではない（図３参照）ので残されている。従って、最初の繰り返しでＳ３は除去されているが、Ｓ８はその段階で除去されていない。
【００５０】
処理の最終結果として、プロファイリング装置は、プロファイリングに非常に重要な関数、すなわち、プロファイリングメトリックに関して非常に興味のある関数のみを含むという意味で、最適化された関数のサブセットを生み出す。換言すれば、この方法の目的は、開始点として全ての関数のプロファイリングを採用するのではなく、プロファイリングのないところから開始して、その後に、タイミングを許容できないほど歪ませることなく重要な特徴を捉えることが出来るプロファイリングを組み込むことである。
【００５１】
上述の反復処理は、幾らかの時間を要するものではあるが、全ての関数のプロファイリングデータを収集することなしに、最も重要な関数群に関してプロファイリングデータを取得することを可能にする。また、場合により何時間又は何日も要する完全な実行を行う代わりに、制限ベースあるいはテストベースで（例えば、比較的小さい試験データセットを用いて）プログラムの実行をプロファイリングすることによって、処理を実行することが可能である。言及しておくが、例えばプロファイリングメトリックなどの開始条件がいったん設定されると、この処理は人の介入なく自動的に進むようにされることができる。
【００５２】
斯くして自動的に生成された関数のサブセットは、当然ながら、人であるユーザによって改訂されてもよいが、その場合であっても、ユーザの負担は、プロファイリング／最適化されるべきコードの領域群を手動選択する作業と比較して大いに低減される。
【００５３】
図５は、最適化された最終的なプロファイリングコールグラフの一例を示している。この図は、メイン関数Ｓ０の他に、１４個の関数Ｓ１−Ｓ１４のうちの７個のみを含んでいる。使用されるメトリック、その基準値及び閾値に応じて、より多く、あるいはより少ない関数が本発明に係る方法によって除去され得る。故に、この単純な例においてのように元の関数群のうちの半分を退けるのではなく、９０％又はそれより多くが退けられてもよい。排除される関数の割合が前もって決定されて、所望の結果を達成するように、開始条件及び／又は処理を終了させる階層レベルが適切に変化されてもよい。上述の関数のサブセットは、更なるプロファイリング又は更に徹底的なプロファイリングに掛けられてもよいし、あるいは直接的に、例えば手動再設定又は特別な最適化コンパイラによる再コンパイルなどの最適化技術の対象とされてもよい。
【００５４】
図５はまた、処理が進むにつれて関数の階層レベルがどのように変化し得るかを例示している。換言すれば、コールグラフは固定されたものではなく、反復ごとに改編される。見て取れるように、先に言及したＳ８はレベルを移動させている。上述のように、或る関数が２つ以上の上位関数によって呼び出される場合、該関数のレベルはメイン関数から数えた最小の呼び出し数によって決定される。図３に示したように、Ｓ８は元々はレベル２にあった（Ｓ０→Ｓ３→Ｓ８）。しかしながら、この経路はＳ３が除外された時に除去されている。故に、Ｓ８はＣＧ１でのレベル２からＣＧ３でのレベル４（呼び出し経路Ｓ０→Ｓ２→Ｓ７→Ｓ１３→Ｓ８による）に移動している。
【００５５】
各レベルでメトリックを正確に計上するとともに、各レベルでプロファイリングオーバヘッドがどこに由来するかを知り、それにより関数を適切に除外することが重要である。これが意味することは、或る関数が複数のレベル内にある場合には、インスツルメンテーションを有する１つと有しない１つとの、関数の２つのインスタンスが存在する必要があるということである。インスツルメンテーションを有する計装された関数はプロファイリングコールグラフ内の関数から呼び出され、通常の関数は、未だ計装されていない関数によって呼び出される。
【００５６】
この点を更に説明するために、図６は、或る関数（ラベル３を付す）が上位レベルにある複数の関数によって呼び出され得る様々なケースを例示している。この図において、“Ａ”はプロファイリングされていない（すなわち、インスツルメンテーションコードを有しない、あるいは該コードが無効化されている）関数を表し、“Ｂ”はプロファイリングを付加／有効化した関数を表している（このＡ／Ｂのラベルは、ここでは、コールグラフから関数を省略することの代替手段として使用されている）。図６（ａ）に示すように、関数３は、プロファイリングされていない関数Ａ３として未プロファイリング状態で開始し、最上位レベルの関数によって呼び出される２つの上位レベル関数１及び２によって呼び出されると仮定する。
【００５７】
図６の（ｂ）−（ｄ）に示すように、最上位レベルの関数がプロファイリングされる、すなわち、Ｂ０と見なされるセットに含められるとする。Ｂ０から関数３には２つの別々のブランチが存在し、関数３のプロファイリングには以下の３つの可能性が存在する：
（ｉ）図６（ｂ）に示すように、何れのブランチにおいてもプロファイリングされない；
（ｉｉ）図６（ｃ）に示すように、一方のブランチでプロファイリングされるが、他方ではされない。この場合、プロファイリングされる１つ（Ｂ３）及びされない１つ（Ａ３）である関数３の２つのインスタンスを管理することが必要である；
（ｉｉｉ）図６（ｄ）に示すように、双方のブランチでプロファイリングされる。この場合、単一の計装された関数の複製Ｂ３が存在する。
【００５８】
図７は、処理の様々な繰り返しでのコールグラフを、実行時間のインジケータとともに示している。図６においてのように、“Ａ”はプロファイリングされない関数を表し、“Ｂ”はプロファイリングされる関数を表している。
【００５９】
アプリケーションが図７（ａ）に示すコールグラフで８個の関数Ａ０−Ａ７を有しているとする。最初のステップにて、アプリケーションは、上述のように如何なるインスツルメンテーションもなく走らされ、プロファイリングメトリック（この場合、時間）の基準値が提供される。これは図７（ｂ）に“反復０”として示されている。
【００６０】
次に、レベル１の関数（Ｂ１、Ｂ２及びＢ３）が検討中のセットに追加される。換言すれば、これらの関数に対してインスツルメンテーションが付加／有効化される。なお、関数Ｂ２はレベル１に関してのみ追加されている。換言すれば、関数２へと上位に戻るＡ６からの関数呼び出しは、図７（ｃ）の右側の変更コールグラフに示されるように、この関数の第２の下位レベルインスタンスＡ２によって説明される。アプリケーションが再び走らされ（反復１）、図７（ｃ）の左側部分に示すように、実行時間はプロファイリングオーバヘッドのために少々長くなる。
【００６１】
この時点で、関数Ｂ３は、実行時間のうちの小さい部分（図７（ｃ）の下側のタイムバーのうちの最も右側の部分で指し示される）のみを占めるので落とされる。そして、関数Ａ７はＢ３によってのみ呼び出されるので無視されることができる。
【００６２】
残りの次レベルの関数Ａ４、Ａ５及びＡ６がセットに追加されて（Ｂ４、Ｂ５及びＢ６になっている）、反復２が実行される（図７（ｄ））。この場合、比較的長い実行時間になっている。反復１（図７（ｃ））と反復２（図７（ｄ））との間で、プロファイリングによるオーバヘッドは、許容可能レベルを超えて増大している。レベル１の関数（Ｂ１及びＢ２）に関して報告される時間の変化を調べることにより、これがＢ１の子によるものであることが分かる。従って、Ｂ６に加えて、Ｂ１によってのみ呼び出される関数Ｂ４も落とされる。関数Ｂ１及びＢ２から呼び出される関数Ｂ５は、Ｂ１によって呼び出されるときは落とされ、Ｂ２によって呼び出されるときは残される。図７（ｅ）には、より扱いやすい実行時間（なおも反復２にある）を有する縮小された関数セットが、ラベル付けしたコールグラフとともに示されている。
【００６３】
プロファイリングメトリック
アプリケーションの性能を測定するために使用可能なプロファイリングメトリックは数多く存在する。この機構に関する主な要件は、特定の関数に関するメトリックの値が、親によって呼び出される全ての子の値を含むことである。
【００６４】
経過時間：或る関数にて費やされる時間が、最も一般的に使用される性能メトリックである。
【００６５】
メモリ：割り当てられるメモリ量も重要なメトリックである。しかしながら、子関数にて割り当てられるメモリの詳細は親関数には利用可能でない。これに対処するためには、malloc()又は何らかの等価な関数がメモリを割り当てるとき常に共有カウンタを更新する代替的なシステムライブラリを用いてアプリケーションをリンクすることが必要である。そして、アプリケーションが或る関数に出入りする時にこのカウンタの値がアクセスされ、親関数及び子関数によって割り当てられたメモリ量が決定される。
【００６６】
ディスク使用状況：ディスクに読み書きされるデータの量は性能に影響を及ぼす。これは、メモリ使用状況を測定することに関して概説したのと等価な手順を用いて測定することができる。
【００６７】
ハードウェアカウンタ：ハードウェア性能カウンタは、例えば命令数、キャッシュミス及びＴＬＢミスなどの有用なプロファイリング情報を測定している。或る関数に出入りする時に値を記録することにより、これらのカウンタをプロファイリングメトリックとして使用することができる。
【００６８】
以上から明らかなように、一部のメトリックは、プログラム自体の外部の要因に依存し、故に、ライブラリ内においてか、あるいは場合によりディスクアクセスを捕捉するオペレーティングシステムレベルにおいてかの何れかで、実行ファイル自体の外部のプロファイリングフックを必要とする。
【００６９】
上述のメトリックは、或る程度、相互に関係があり、しばしば、互いに逆の関係にある。例えば、非常に高速に動作するようにコード化された関数は、多くのメモリを占有し得る。あるいは、メモリ使用量を低く維持するように記述された関数は、多くのディスクアクセスを必要とし得る。従って、処理の最終結果は、使用されるメトリックに応じて異なったものとなり得る。本発明に係る方法は、異なる複数のメトリックを用いて繰り返されることが可能であり、関数のサブセットに磨きをかけるために、それぞれの結果を比較することができる。例えば、個々のメトリックの各々に関して特定された関数を組み合わせ、関数の上位集合を形成し得る。斯くして、２つ以上のメトリックの必要性とバランスさせて最適化が実行され得る。
【００７０】
本発明に係る方法を実行した結果は、一般的に、プログラムを実行するコンピュータシステムのハードウェア構成にも依存する。しかしながら、このことは通常のプロファイリングの状況と異なるものではなく、最適化の目的はしばしば、特定のシステム上で良好に動作するようにプログラム（恐らくは、元々において、異なるハードウェア技術用に、あるいは更には異なる言語で記述される）を最適化することである。故に、本発明の一実施形態は、以下の条件を満足しながらアプリケーションプロファイリングを実行し得る：
例えば経過時間などの特定のメトリックのうちの高い割合を占める関数を決定する；
それら関数のコールグラフを決定する；
プロファイリングの時間歪みを最小化する；
プロファイリングデータの量を最小化する；
人の介入なく作動する。
【００７１】
本発明の範囲内で様々な変形が可能である。
【００７２】
以上の説明において、プロファイリングコードはコンパイラによって、あるいはコンパイル前にプリプロセッサによって付加されている。しかしながら、インスツルメンテーションはオブジェクトコードに付加されることも可能である。この変形は、上述のステップＳＴ２０“適切なプロファイリングフックを用いて再コンパイル”を、“バイナリインスツルメンテーションを実行してプロファイリングフックを付加／除去”に変更することを必要とする。
【００７３】
他の１つの変形は、全ての関数用のプロファイリングフックを前もって、例えばコンパイル中に設け、その後の実行時に、それらを選択的に有効化／無効化（イネーブル／ディセーブル）することを伴う。関連した技術が、ＩＢＭ社への米国特許第５９６０１９８号に記載されている。この場合にプロファイリングフックを無効化することは、リストから関数を除去することと等価であり、プロファイリングフックを有効化することは、対応する関数をリストに追加することである。故に、この例において、上述のステップＳＴ２０及びＳＴ２２は、“選択されたプロファイリングフックを有効又は無効にしてプログラムを走らせること”という単一のステップで置き換えられる。
【００７４】
プロファイリングメトリックに基づいて閾値を指定することに代えて、あるいは加えて、最終的なサブセットに含めるべき関数の目標数を設定してもよい。
【００７５】
以上の説明はプロファイリングメトリックの閾値割合を参照している。これは必ずしも不可欠なものではなく、より一般的には、メトリックに関する何らかの所定の基準を満たす（あるいは満たさない）関数を除去することが可能である。
【００７６】
“コールグラフ”を参照してきたが、実際のコールグラフをユーザに表示する必要はない。コールグラフはプロファイリング装置内に、単に概念的に、あるいは単に含蓄的に存在していてもよい。また、プロファイリング装置が図３の完全なコールグラフＣＧ１を取得する必要はなく、これは単に理解を支援するものとして含められているに過ぎない。装置は単純に、未調査の下位レベルにある関数を意識することなく、処理の次の反復に必要な情報、換言すれば、それまでに選択された関数によって直接的に呼び出される関数だけを計算してもよい。
【００７７】
上述のように、本発明に係る方法を実行するために使用される装置は、プログラムそれ自体を実行するために使用されるのと同一のコンピュータシステムであってもよいし、別個のコンピュータであってもよい。何れにしても、本発明はコンピュータ読み取り可能コードにて具現化され得る。このようなコードはコンピュータ読み取り可能媒体に格納され得る。
【００７８】
一例として、図８は、本発明に係る方法を実行する装置を模式的に示している。実際には、この装置は、アプリケーションを走らせ、且つここに例示する特定のユニット又は部分を提供するように更にプログラムされた汎用コンピュータシステムの形態をとる。
【００７９】
アプリケーション１７は、例えば大型コンピュータシステムのハードディスクアレイなどのメモリ３１内に保持されている。コード分析ユニット３２が、アプリケーションコードを調べて、アプリケーション内の構成関数を最上位（Ｓ０）から最下位までレベルごとに分類する。
【００８０】
関数記憶ユニット３３が、検討中の現在の関数サブセット（すなわち、上述のように、所与のレベルにある関数群）を何らかの手法で記録する。これは、それぞれのコードブロック自体ではなく、各関数のポインタ又はＩＤを格納することによって達成され得る。
【００８１】
インスツルメンテーションユニット３４が、上述の技術のうちの１つを用いて、現在サブセット内の各関数用のプロファイリングコードを付加あるいは有効化し、これを格納されたアプリケーション１７に適用する。
【００８２】
実行ユニット３６が、現在付加／有効化されているプロファイリングコードを含むアプリケーションを走らせ、それにより、現在の関数サブセットに関するプロファイリングデータを生成する。このプロファイリングデータはプロファイルデータ記憶ユニット３７に格納される。
【００８３】
プロファイリングデータの結果は関数選択ユニット３８に利用可能にされ、関数選択ユニット３８は、選択されたプロファイリングメトリック（上述の説明を参照）に基づいて、検討から除外されるべき関数を決定する。
【００８４】
関数記憶ユニット３３が、無視されるべきものとして関数選択ユニット３８によって特定された関数を消去し、且つコード分析ユニット３２によって提供される情報を用いて次レベルからの関数を追加することによって、関数のサブセットを更新する。そして、インスツルメンテーション、実行、及びプロファイリングデータの分析の処理が、上述のようにして繰り返される。
【００８５】
以上の説明に関し、更に以下の付記を開示する。
（付記１）
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングする方法であって、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む、方法。
（付記２）
前記分類するステップは更に、前記複数の関数のコールグラフを決定することを有し、
前記サブセットを縮小するステップは更に、前記除去された関数及び前記選外関数を前記コールグラフから消去することを有すること特徴とする付記１に記載の方法。
（付記３）
前記関数はコンパイル可能なコードの形態を有すること特徴とする付記１又は２に記載の方法。
（付記４）
前記プロファイリングデータを生成するステップは、各関数をコンパイルする処理の間又は前に、前記プロファイリングコードを付加すること特徴とする付記３に記載の方法。
（付記５）
前記プロファイリングデータを生成するステップは、前記関数に既に設けられているプロファイリングコードを有効化することを特徴とする付記３に記載の方法。
（付記６）
前記分類するステップに先立って、プロファイリングメトリックを選択し、且つプロファイリングコードを用いずに前記ソフトウェアアプリケーションを実行することで、選択されたメトリックの基準値を確立するステップを更に有することを特徴とする、付記１乃至５の何れか一項に記載の方法。
（付記７）
前記サブセットを縮小するステップは、関数を、それに関連するプロファイリングデータが前記プロファイリングメトリックに関する所定の条件を満たすか否かに基づいて除去することを含む、ことを特徴とする付記６に記載の方法。
（付記８）
前記サブセットを縮小するステップは、前記プロファイリングメトリックに従って、プロファイリングされた関数をランク付けすることを含み、前記所定の条件は前記基準値のうちの所与の割合である、ことを特徴とする付記７に記載の方法。
（付記９）
前記プロファイリングメトリックは、実行時間、メモリ使用状況、ディスク使用状況、及びハードウェアカウンタに基づくメトリックのうちの少なくとも１つである、ことを特徴とする付記８に記載の方法。
（付記１０）
前記所定の階層レベルは前記最下位レベルである、ことを特徴とする付記１乃至９の何れか一項に記載の方法。
（付記１１）
前記所定の階層レベルは、目標とする数又は割合の関数が選外となるか、除去されることになった階層レベルである、ことを特徴とする付記１乃至９の何れか一項に記載の方法。
（付記１２）
前記最適化されたコールグラフをユーザに表示するステップ、を更に有することを特徴とする付記２に記載の方法。
（付記１３）
前記所定の階層レベルに到達したときに得られた前記サブセットに含まれる関数のコードを最適化するステップ、を更に有することを特徴とする付記１乃至１２の何れか一項に記載の方法。
（付記１４）
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションを自動的にプロファイリングする装置であって、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するように構成されたコード分析ユニットと、
現在レベルにおける関数群のサブセットを記録するように構成された関数記憶ユニットと、
前記サブセットの関数群の各々に対してプロファイリングコードを付加あるいは有効化するように構成されたインスツルメンテーションユニットと、
前記ソフトウェアアプリケーションを実行して、プロファイリングデータを生成するように構成された実行ユニットと、
前記実行ユニットによって生成されたプロファイリングデータを保持するプロファイルデータ記憶ユニットと、
前記プロファイリングデータに基づいて関数を消去し、且つ消去された関数によってのみ呼び出される関数を除いた前記現在レベルの下の次レベルからの関数を記録するよう、前記関数記憶ユニットに命令するように構成された関数選択ユニットと、
を含み、
前記インスツルメンテーションユニット、前記実行ユニット、前記プロファイルデータ記憶ユニット、及び前記関数選択ユニットは、所定の階層レベルに到達するまで繰り返し動作するように構成される、
装置。
（付記１５）
メイン関数を含む複数の関数を有し、該関数間で階層的に呼び出しが行われるソフトウェアアプリケーションをプロファイリングさせるプログラムであって、コンピュータに、
前記複数の関数の各々を、前記メイン関数からの最小の呼び出し段数に従って、少なくとも最上位レベル及び最下位レベルを含む複数の階層レベルのうちの１つに分類するステップと、
前記最上位レベルで開始して、現在レベルにおける関数群のサブセットを定めるステップと、
前記サブセットの関数群に対してプロファイリングコードを付加あるいは有効化し、且つ前記ソフトウェアアプリケーションを実行することで、プロファイリングデータを生成するステップと、
前記プロファイリングデータに基づいて前記サブセットから関数群のうちの１つ以上を除去することにより、前記サブセットを縮小するステップと、
前記サブセットを縮小するステップにて除去された関数によってのみ呼び出される関数に、選外関数としてマークを付すステップと、
所定の階層レベルに到達するまで、
前記現在レベルの下の次レベルから前記選外関数以外の関数群を前記縮小されたサブセットに追加して、前記プロファイリングデータを生成するステップ、前記サブセットを縮小するステップ、及び前記マークを付すステップを繰り返すステップと、
を含む処理を実行させるプログラム。
【図１】
2011248895.tif 000003
【図２】
2011248895.tif 000004
【図３】
2011248895.tif 000005
【図４】
2011248895.tif 000006
【図５】
2011248895.tif 000007
【図６】
2011248895.tif 000008
【図７】
2011248895.tif 000009
【図８】
2011248895.tif 000010
【外国語明細書】
2011248895000001.pdf