MATLABのプログ​ラミングにおいてどの​ように関数をコールす​れば高速化ができます​か?

17 ビュー (過去 30 日間)
MathWorks Support Team
MathWorks Support Team 2013 年 10 月 1 日
編集済み: MathWorks Support Team 2016 年 2 月 15 日
MATLABのプログラミングにて、以下のような方法で関数をコールした場合の所要時間について教えてください。どの方法が一番高速に処理できますか。
1. 処理を別関数化せず、メインルーチンに直接記述する方法 (inline)。
2. 関数を他のMATLABファイルに記述する方法。データは関数の引数で渡します (file-pass)。
3. 関数を他のMATLABファイルに記述する方法。データはグローバル変数を介して渡します。インデックスのみ、関数の引数で渡します (file-global)。
4. 入れ子関数による方法。データは関数の引数で渡します。クローズされた関数内のみ (nest-pass)。
5. 入れ子関数による方法。データは共有変数を介して渡します。クローズされた関数内のみ (nest-share)。
6. サブ関数による方法。データは関数の引数で渡します (sub-pass)。
7. サブ関数による方法。データは参照可能なグローバル変数を介して渡します。インデックスのみ関数の引数で渡します (sub-global)。
詳細についてはサンプルプログラム testTop.m, testCompute および testComputeGlobal.m をご覧ください。

採用された回答

MathWorks Support Team
MathWorks Support Team 2018 年 10 月 5 日
速い順に並べると以下のようになります。
1) inline
2) file-pass, nest-pass, sub-pass
3) nest-share
4) sub-global
5) file-global
まず、inline が速い理由として、関数呼び出しのオーバーヘッドの影響を受けないことがあげられます。
次に、file-pass, nest-pass, sub-pass は inline よりも遅くなる原因を説明します。データを呼び出された関数に渡すときに、呼び出す側の関数は呼び出される側の関数がデータのある場所を特定できるようにセットアップします。このセットアップは関数呼び出しのオーバーヘッドとなり、パフォーマンスに影響します。
さらに、 nest-share が file-pass, nest-pass, sub-pass よりも遅くなる理由を説明します。もしワークスペースが入れ子関数と共有され、かつ、入れ子関数に渡されるデータがこのワークスペース上にある場合、データ渡しよりもパフォーマンスは遅くなります。もし、 MATLAB が共有ワークスペース上の変数を参照する場合、ワークスペース上の変数を検索するからです。一方、データが呼び出し側の関数により渡される場合、MATLAB はデータを検索する必要がなくなります。
最後に、グローバル変数を含む関数呼び出しは、そのほかのケースよりも非常に遅い理由を説明します。関数がグローバル変数を呼ぶ場合、パフォーマンスは遅くなります。これは、グローバル変数を検索するための、現在のワークスペースよりも外側も検索する必要があるからです。
MATLAB アクセラレータを OFF すると、inline と file-global のパフォーマンスが大幅に異なることが確認できます。
feature accel off
これらのパフォーマンスは一般的な話であり、実際には、OS、CPU、などにより異なる場合もありますので、ご注意ください。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange実行速度 についてさらに検索

製品


リリース

R2009a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!