パフォーマンス向上のためのコードのプロファイリング
プロファイリングとは
"プロファイリング" とは、コード実行の所要時間を測定し、MATLAB® が最も時間を費やした場所を特定する方法です。最も多くの時間を消費している関数を特定し、パフォーマンスを改善できる可能性がないか評価できます。また、コードをプロファイリングして実行されないコード行を確認できます。実行されないコード行を特定することは、コードのテストを開発する場合や、デバッグ ツールとしてコード内の問題を切り分ける際に役立ちます。
コードのプロファイリングは、MATLAB プロファイラーを使用して対話的に行うか、プログラムで関数 profile
を使用して行うことができます。プログラムを使用したコードのプロファイリングの詳細については、profile
を参照してください。並列実行するコードをプロファイリングする場合は、最良の結果が得られるように Parallel Computing Toolbox™ の並列プロファイラーを使用してください。詳細は、並列コードのプロファイル (Parallel Computing Toolbox)を参照してください。
ヒント
コードの最適化を急ぎ過ぎると、パフォーマンスを著しく向上させることなく、不必要にコードが複雑になる場合があります。最初の実装は可能な限り簡単にしてください。その後で、速度が問題である場合は、プロファイリングを使ってボトルネックを同定します。
コードのプロファイリング
コードをプロファイリングしてパフォーマンスを向上するには、以下の一般的なプロセスを使用します。
コードに対してプロファイラーを実行します。
プロファイル概要の結果を確認します。
関数およびコードの個々の行を調査します。
たとえば、関数やコード行のうち、かなりの時間を要するものや、最も頻繁に呼び出されるものを調査することができます。
プロファイリング結果を保存します。
パフォーマンスを向上できる可能性のある改善策をコードに実装します。
たとえば、ループ内に
load
ステートメントがある場合、load
ステートメントが 1 回だけ呼び出されるようにループの外に移動することが可能な場合もあります。ファイルを保存し、
clear all
を実行します。プロファイラーを再度実行して、その結果を元の結果と比較します。上記の手順を繰り返して、コードのパフォーマンスを引き続き向上させます。コードがほとんどの時間を少数の組み込み関数の呼び出しに使っている場合は、おそらくコードは可能な限り最適化されています。
コードに対するプロファイラーの実行
コード行に対してプロファイラーを実行するには、次を行います。
[アプリ] タブに移動し、[MATLAB] の下で、プロファイラー アプリ アイコンをクリックしてプロファイラーを開きます。コマンド ウィンドウで
profile viewer
と入力することもできます。[プロファイラー] タブに移動し、[プロファイラー] セクションのエディット ボックスに、プロファイリングするコードを入力します。
たとえば、MATLAB で提供されている Lotka-Volterra の例で、被捕食者と捕食者の個体数のピークを求める関数
solvelotka.m
を作成します。次のステートメントをエディット ボックスに入力して関数function [preypeaks,predatorpeaks] = solvelotka(t0, tfinal, y0) [~,y] = ode23(@lotka,[t0 tfinal],y0); preypeaks = calculatepeaks(y(:,1)); predatorpeaks = calculatepeaks(y(:,2)); end function peaks = calculatepeaks(A) [TF,P] = islocalmax(A); peaks = P(TF); end
solvelotka
をプロファイリングします。[preypeaks,predatorpeaks] = solvelotka(0,15,[20;20])
現在の MATLAB セッションでこのステートメントをプロファイリングしたことがある場合は、エディット ボックスのドロップダウン リストから選択することもできます。
[実行および時間の計測] をクリックします。
プロファイリングが完了すると、プロファイラーの [プロファイル概要] に結果が表示されます。プロファイリングしたステートメントの結果は、コマンド ウィンドウで実行したようにも表示されます。
エディターで開いているコード ファイルをプロファイリングするには、[エディター] タブの [実行] セクションで、[実行] 、 [実行および時間の計測] を選択します。プロファイラーは、現在の [エディター] タブで開いているコード ファイルをプロファイリングし、[プロファイル概要] に結果を表示します。
プロファイル概要の結果の確認
コードに対してプロファイラーを実行後、[プロファイル概要] には、コードの実行全体に関する統計が表示され、呼び出された関数ごとの要約統計量が提供されます。たとえば、以下の図は、関数 solvelotka
の [プロファイル概要] を示しています。
[プロファイル概要] の結果の上部には、MATLAB がコード実行に費やした時間を視覚的に表現したフレーム グラフが表示されます。フレーム グラフでは、実行された関数がそれぞれ 1 つのバーで表現されます。ユーザー定義関数は青で、MathWorks® 関数はグレーで表示されます。
グラフ内の関数は階層順に表示され、親関数はグラフの下側に、子関数はグラフの上側に表示されます。[プロファイル概要] とラベル付けされた、グラフの下部全体に広がっているバーは、実行されたすべてのコードを表します。グラフ上のバーの幅は、関数の実行に要した時間を、合計実行時間に占める割合で表します。
実際の割合および時間の値と、関数の完全な名前を確認するには、グラフ内のバーにカーソルを合わせます。個々のコード行に関する情報を含む、関数の詳細情報を表示するには、その関数を表すバーをクリックします。
フレーム グラフのフレームの下にある関数テーブルには、フレーム グラフと同様の情報が表示されます。最初は、関数は処理時間の長い順にリストされます。次の表で、各列の情報について説明します。
列 | 説明 |
---|---|
関数名 | プロファイリングされたコードによって呼び出される関数の名前。 |
呼び出し | プロファイリングされたコードが関数を呼び出した回数。 |
合計時間 | 関数に費やした合計時間 (秒単位)。関数の時間は、子関数に費やした時間を含みます。プロファイラー自体もある程度時間を消費し、それも結果に含まれています。実行時間が非常に短いファイルの合計時間は 0 になる場合があります。 |
自己時間 | 子関数に消費した時間を除く、関数に消費した合計時間 (秒単位)。自己時間はプロファイラーのプロセスのオーバーヘッドもある程度含みます。 |
合計時間プロット | 合計時間と比較した自己時間のグラフィックス表示。 |
特定の列を基準として関数テーブルを並べ替えるには、列ヘッダーの矢印をクリックします。たとえば、[関数名] 列の矢印をクリックして関数をアルファベット順に並べ替えます。最初は、結果は [合計時間] 列の順序で表示されています。個々のコード行に関する情報を含む、関数の詳細情報を表示するには、関数名をクリックします。
関数および個々のコード行の調査
コード内で改善の可能性を見つけるには、フレーム グラフまたは関数テーブルで、多くの時間を要している関数や、最も頻繁に呼び出される関数を探します。関数名をクリックして、個々のコード行に関する情報を含む、関数の詳細情報を表示します。たとえば、関数 solvelotka>calculatepeaks
をクリックします。プロファイラーに、この関数に関する詳細が表示されます。
プロファイラーのページ上部の現在の関数の名前の横に、その関数が親関数によって呼び出された回数と、その関数に費やした合計時間が表示されます。フレーム グラフの下に表示されるリンクを使用して、関数を既定のエディターで開くか、表示される結果を別のウィンドウにコピーします。
[プロファイル概要] に戻るには、[プロファイラー] タブの [プロファイル概要] ボタンをクリックします。フレーム グラフの下にある [プロファイル概要] バーをクリックすることもできます。
個別の関数をクリックすると、プロファイラーの以下のセクションに追加情報が表示されます。
セクション | 詳細 |
---|---|
フレーム グラフ | MATLAB がプロファイリングされた関数の実行に費やした時間を視覚的に表現するフレーム グラフ。このグラフには、プロファイリングされた関数の階層が、子関数 (現在の関数より上に表示) と親関数 (現在の関数より下に表示) を含めて表示されます。ユーザー定義関数は青 ( グラフ内でバーにカーソルを合わせると、実際の割合および時間の値と、関数の完全な名前を確認できます。ある関数を表すバーをクリックすると、その関数の詳細情報が表示されます。 |
親 | プロファイリングされた関数を呼び出す関数のリスト。親関数がプロファイリングされた関数を呼び出した回数を含みます。 リスト内で任意の関数名をクリックすると、その関数の詳細情報が表示されます。 |
最も時間を要する行 | プロファイリングされた関数の中で、処理時間の最も長かったコードのリスト。 任意のコード行をクリックすると、残りの関数コードのコンテキスト内で、そのコード行を [関数リスト] セクションで確認できます。 |
子 | プロファイリングされた関数によって呼び出されるすべての関数のリスト。 リスト内で任意の関数名をクリックすると、その関数の詳細情報が表示されます。 |
コード アナライザー結果 | プロファイリングされた関数の問題と潜在的な改善点のリスト。 |
カバレッジの結果 | プロファイリング中に MATLAB が実行した関数のコード行に関するコード カバレッジの統計。 コードに対する追加のコード カバレッジ解析を実行するには、HTML 形式のコード カバレッジ レポートの生成を参照してください。 |
関数リスト | 関数のソース コード (それが MATLAB コード ファイルである場合)。 コードの各行について、[関数リスト] には次の列が含まれます。
プロファイラーでは、既定で、実行時間が最も長くかかったコード行が強調表示されます。強調色が濃いほどコード行の実行時間が長くなります。強調表示の条件を変更するには、[プロファイラー] タブに移動し、[ビュー] セクションの [強調表示] |
結果の保存
コードを改善後に変更の影響を比較するには、プロファイリング結果を保存します。結果を保存するには、フレーム グラフの下に表示されているリンクを使用して、表示される結果を別のウィンドウにコピーします。
[プロファイラー] タブに移動して [印刷] ボタンをクリックすることにより、プロファイラーから結果を印刷することもできます。
コマンド ウィンドウでの複数ステートメントのプロファイリング
コマンド ウィンドウで複数のステートメントをプロファイリングするには、次を行います。
コマンド ウィンドウに移動して
profile on
と入力します。プロファイリングするステートメントを入力して実行します。
ステートメントをすべて実行したら、
profile off
を入力します。profile viewer
と入力してプロファイラーを開きます。また、[アプリ] タブに移動し、[MATLAB] の下で、プロファイラー アプリ アイコンをクリックできます。プロファイル概要の結果を確認します。
アプリのプロファイリング
App Designer で作成したアプリをプロファイリングできます。MathWorks 製品に付属しているアプリをプロファイリングすることもできます。たとえば、Signal Processing Toolbox™ に含まれているフィルター設計と解析ツールなどです。
アプリをプロファイリングするには、次を実行します。
[アプリ] タブに移動し、[MATLAB] の下で、プロファイラー アプリ アイコンをクリックしてプロファイラーを開きます。コマンド ウィンドウで
profile viewer
と入力することもできます。[プロファイラー] ツールストリップの [プロファイル] セクションで、
[プロファイル開始] をクリックします。ボタンの右にあるエディット ボックスにコードがないことを確認します。
アプリを起動します。
アプリを使用します。
完了したら、[プロファイラー] ツールストリップの
[プロファイル停止] をクリックします。
プロファイル概要の結果を確認します。
メモ
アプリの起動プロセスをプロファイルから除外するには、手順 2 と 3 を逆にします。つまり、アプリを起動してから [プロファイル開始] をクリックします。