関数ファイルとスクリ​プトファイルの実行時​間の違いについて

12 vues (au cours des 30 derniers jours)
gafakel
gafakel le 28 Juin 2022
Commenté : gafakel le 8 Juil 2022
使用しているコードが諸般の事情から載せられず大変申し訳ないのですが、以下のように2つのプログラムがあるとします。
  • ただただ、処理が初めから最後まで書かれているスクリプトA
  • スクリプトAについて、先頭行に"function"、最終行に"end"を付け足して関数化した関数A'
なお、関数A'は返り値としてテーブル型変数Bを出力しますが、スクリプトAでは実行の一番最後で全く同一のテーブル型変数Bを出力します。
ここで、これらA,A'のmファイルでは実行時間の計測のためにtic/toc関数を用いているのですが、スクリプトAは処理が1時間程度で終わるのに対し、関数A'では6時間程度かかります。プログラム内で(必要不可欠な)forループを回す回数も一緒、使用している変数やその値もすべて一緒、と「プログラム・処理は全く一緒」なのに、なぜこのような大きな差が生まれるのでしょうか?以前、下記の質問を拝見して「関数化すると処理が高速化出来うる」と知ったためにやってみたのですが……。
ちなみに、書くとすると(何も中身がありませんが)こういう感じでしょうか。
スクリプトA:
tBegin=tic;
%%%%%何らかの処理%%%%%
B=table(tBegin);
toc(tBegin);
% ->ここで1時間ほど(3000sec程度)が結果として出力される
関数A':
function outP=funA()
tBegin=tic;
%%%%%何らかの処理%%%%%
B=table(tBegin);
outP=B;
toc(tBegin);
end
% ->実行すると6時間ほど(20000sec程度)が結果として出力される
具体的な原因究明のための足掛かりが提示できず大変恐縮ですが、何かお考えがあればご教示いただけますと幸いです。よろしくお願いいたします。

Réponse acceptée

Hernia Baby
Hernia Baby le 28 Juin 2022
Modifié(e) : Hernia Baby le 28 Juin 2022
関数のスピードについては以下を参照ください。今回は恐らく入れ子関数のことを言ってるのかなと思います。 MATLABのプログラミングにおいてどのように関数をコールすれば高速化ができますか?
  4 commentaires
Hernia Baby
Hernia Baby le 29 Juin 2022
前に進めそうでよかったです。
ちなみに何処がボトルネックかはprofileを使うと効率的かなと思います。
もし意図とマッチしていましたらご活用ください。
------------------------------------------------------------------------------------------------
gafakel
gafakel le 8 Juil 2022
ありがとうございます。いただいたprofileの情報を元に確認してみると、「プログラムのコードが長くなると面倒だから別ファイル化したmファイル」が原因だとわかりました。ので、これを全て大元の関数ファイル内に戻したところ、実行時間が半分以下に縮まりました。 大変助かりましたので、そのお礼を申し上げるとともに、もし同様の事象が起きた場合の参考になればと思いコメントした次第です。ありがとうございました。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur MATLAB dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!