パフォーマンス向上の手法
コードのパフォーマンスを高速化するには、以下の手法を検討してください。
環境
演算リソースを共有したり、MATLAB® コードのパフォーマンスを低下させる、バックグラウンド プロセスに留意してください。
コードの構造
コードの構成中は以下を考慮してください。
スクリプトの代わりに関数を使用する。通常、関数のほうが高速です。
入れ子関数よりローカル関数を選ぶ。特に、メイン関数の変数にアクセスする必要がない関数の場合にこの方法を使用します。
モジュラー プログラミングを使用する。ファイルが大きくなったり、稀にしかアクセスされないコードを含んだりしないように、コードを単純でまとまりのある関数に分割します。この手法により、初回の実行コストを削減できます。
パフォーマンスのためのプログラミング手法
コードのパフォーマンスを向上するためには、以下のプログラミング手法を検討してください。
事前割り当て — 配列のサイズを連続的に変更する代わりに、配列に必要な最大のスペースを事前に割り当てることを検討します。詳細は、事前割り当てを参照してください。
ベクトル化 — ループベースのコードを記述する代わりに、MATLAB の行列およびベクトル演算の使用を検討します。詳細は、ベクトル化を参照してください。
独立した演算のループ外部への配置 —
for
ループやwhile
ループのそれぞれの反復でコードの評価が変わらない場合は、冗長演算を避けるためにループの外に移動します。新しい変数の作成 (データ型が変化する場合) — 既存の変数に異なる型のデータを代入するのではなく、新しい変数を作成します。既存の変数のクラスまたは配列の形状を変更すると、処理のために余分な時間がかかります。
ショートサーキット演算子の使用 — 可能な場合はショートサーキット論理演算子の
&&
および||
を使用します。MATLAB は、結果が最初のオペランドによって完全に決定されない場合にのみ 2 番目のオペランドを評価するので、ショートサーキットはより効率的です。詳細については、Short-Circuit AND
およびShort-Circuit OR
を参照してください。グローバル変数の回避 — グローバル変数の使用を最小限にすることは有効なプログラミング手法です。グローバル変数は MATLAB コードのパフォーマンスを低下させる場合があります。
組み込み関数のオーバーロードの回避 — 標準の MATLAB データ クラスでの組み込み関数のオーバーロードを避けます。
"コードとしてのデータ" の使用を回避 — 定数値をもつ変数を生成する多量のコード (たとえば 500 行を超える) がある場合、変数を作成して、たとえば MAT ファイルや
.csv
ファイルなどに保存することを検討します。これで、コードを実行して変数を生成する代わりに、変数を読み込むことができます。関数をバックグラウンドで実行 —
parfeval
をbackgroundPool
と共に使用して、バックグラウンドで関数を実行します。MATLAB で他のコードを同時に実行し、アプリの応答性を向上させることができます。詳細については、バックグラウンドでの関数の実行を参照してください。コードを GPU でまたは並列に実行 — Parallel Computing Toolbox™ のライセンスがある場合に、サポートされる関数に
gpuArray
データを渡して GPU でコードを実行するか、parfor
ループなどを使用してコードを並列実行します。詳細については、並列計算の解決策の選択 (Parallel Computing Toolbox)を参照してください。
特定の MATLAB 関数のヒント
パフォーマンスが重要となるコードを記述する場合は、以下の特定の MATLAB 関数に関するヒントを考慮してください。
必要以上にコードをクリアしない。プログラムで
clear all
を使用しないでください。詳細は、clear
を参照してください。inputname
、which
、whos
、exist(
、var
)dbstack
などの MATLAB の状態をクエリする関数を避ける。実行時のイントロスペクションは計算量が多くなります。eval
、evalc
、evalin
、feval(
などの関数を避ける。可能な限り、fname
)feval
への関数ハンドル入力を使用します。テキストから MATLAB 式を間接的に評価すると、計算量が多くなります。可能な限り、
cd
、addpath
およびrmpath
をプログラムで使用しない。実行時に MATLAB パスを変更すると、コードの再コンパイルが行われます。
関連するトピック
- コードのパフォーマンスの測定
- パフォーマンス向上のためのコードのプロファイリング
- 事前割り当て
- ベクトル化
- グラフィックス パフォーマンス
- GPU パフォーマンスの測定と向上 (Parallel Computing Toolbox)