MATLABのプログラミングにおいてどのように関数をコールすれば高速化ができますか?
4 views (last 30 days)
Show older comments
MathWorks Support Team
on 1 Oct 2013
Edited: MathWorks Support Team
on 15 Feb 2016
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 をご覧ください。
Accepted Answer
MathWorks Support Team
on 5 Oct 2018
速い順に並べると以下のようになります。
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 Comments
More Answers (0)
See Also
Categories
Find more on 実行速度 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!