MATLABのプログラミングにおいてどのように関数をコールすれば高速化ができますか?
17 ビュー (過去 30 日間)
古いコメントを表示
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
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 件のコメント
その他の回答 (0 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!