高速化する必要があるいくつかの Matlab コードがあります。プロファイリングを通じて、特定の関数が実行速度低下の原因であることを特定しました。この関数は、ループ内で何十万回も呼び出されます。
私が最初に考えたのは、関数を mex (Matlab Coder を使用) に変換して高速化することでした。ただし、一般的なプログラミングの感覚では、Matlab と mex コード間のインターフェイスがオーバーヘッドにつながることがわかります。つまり、この mex 関数を何千回も呼び出すのは良い考えではない可能性があります。これは正しいです?または、オーバーヘッドを取り除くために同じ mex が繰り返し呼び出されている場合、Matlab はいくつかの魔法を行いますか?
オーバーヘッドが大きい場合は、コードを再構築して関数自体にループを追加し、その mex を作成することを考えています。それを行う前に、これに費やされた時間を正当化するために、私の仮定を検証したいと思います。
アップデート:
@angainor の提案を試し、次のコードで donothing.m を作成しました。
function nothing = donothing(dummy) %#codegen
nothing = dummy;
end
次に、これから donothing_mex として mex 関数を作成し、次のコードを試しました。
tic;
for i=1:1000000
donothing_mex(5);
end
toc;
その結果、関数の 100 万回の呼び出しに約 9 秒かかりました。これは私たちの目的にとって大きなオーバーヘッドではないので、今のところ、呼び出された関数だけを mex に変換すると思います。ただし、約 100 万回実行されるループから関数を呼び出すことは、これがパフォーマンス クリティカルなコードであることを考えると、かなりばかげた考えのように思えます。そのため、ループを mex 関数に移動することはまだ本に記載されていますが、優先度ははるかに低くなります。