2011-07-21 15 views
3

私はいくつかのMATLABコードを使用しています。 A、B、Cの3つのセクションがあります。AとCは変更できますが、Bは変更されません。私が何をしたか同じコードのMATLAB速度の差

は(単にスクリプトではなく、機能)別のの.mファイルにA、B、およびC別々でした。 Aは変数の集合を作成し、Bは論理を含み、Cは結果のプロットを含む。私はファイルをDと呼ぶことにします。私が行ったことは、A、B、Cの内容全体を線形にコピー/ペーストすることです。

私が実行した場合、Bは、その後、C、B内の反復は、非常にゆっくりと反復につき約15秒になります。 Dを実行すると(ちょうどA、B、Cが貼り付けられます)、繰り返し回数が約2秒になります。 MATLABは、正確に同じ順序でまったく同じコードを実行していることを考えると

、なぜ二人は、このような大幅に異なる実行時間を持っているでしょうか?

+4

多分、MATLAB JITはすべてのコードを一度に見ることができるので、Dでコードを最適化することができます。 – Praetorian

+0

Bをスクリプトの代わりに関数にするとどうなりますか? – k107

+2

また、実行時間をどのように記録していますか? 'clear all; tic、A; B; C; toc'を' clear all; tic、D; toc'と比較してみてください。とにかく@Praetorianは説得力のある説明を与えました。 – Amro

答えて

2

私はあなたに記憶の問題があると信じています。 Matlab関数は実際にポインタとして入力変数を取得しますが、データを変更した場合はコピーになります。 したがって、A、B、Cの入出力が大きく、データの一部が変更されると、多くのメモリが割り当てられます。例えば

:ChangePixel毎回新しいマトリックスを割り当てるため

function Main() 
x = imread('peppers.png'); 
for i=1:size(x,1) 
    for j=1:size(x,2) 
      x = ChangePixel(x,i,j); 
    end 
end 
imshow(x); 
end 

function A = ChangePixel(A,i,j) 
    A(i,j,:) = A(i,j,[3 2 1]); 
end 

このコードは、非常に遅くなります。

Matlabは、これらの種類の操作を検出し、内部最適化を使用することがあります。 しかし、それが起こるかどうかわからないので、この種の操作を避けるのが最善です。

+0

あなたのためのケースではありません。 MATLABは、場合によってはインプレース操作を検出し、それらを最適化して不要なコピーを避けることができます。私の答えはこちらをご覧ください:http://stackoverflow.com/questions/7228613/in-place-quicksort-in-matlab/7233424#7233424 – Amro

+0

ありがとうAmro。常に最適化される例がありますか? –

+0

私の答えでリンクされているLorenのブログ記事を読むべきです:http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/ – Amro

1

再現可能な例がなければ、何が起こっているのかを言うのは難しいです。私はあなた自身を探す方法を教えてくれます。

MATLABを閉じてもう一度開くと、すべてが新鮮です。 (あるいは、少なくとも行うclose all hidden; clear classes; clc;。) あなたがABCを呼び出す前に、あなたはDを呼び出す場合は、同じタイミングを得るのですか?その間で変数をクリアしなかった場合、MATLABは2回目の割り当てを少なくしなければなりませんでした。

タイミングが同じであった場合は、プロファイラを使用する必要があります。 (デスクトップ - >プロファイラをクリックします)各スクリプトのプロファイルを作成し、遅い行を記録します。彼らはマッチしますか?どんなパターンも見えますか?あなたは本当に両方のケースで同じコードが実行されていると確信していますか?タイミングが異なっている理由は明白な理由はまだありません場合は

は、おそらくプレトリアンは右であり、それは深いJITの魔法です。

+0

...プロファイリングに関しては、実際に2対15秒の場合は、ここで説明したプロファイリングの「Ctrl-C」方法が良い考えかもしれません:http://stackoverflow.com/questions/375913/what-c​​an- i-use-profile-c-code-in-linux/378024#378024 ...基本的には、あなたのコードを呼び出す前に 'dbstop if error'を実行してから、Ctrl-Cで遅くなっていると思ったら割り込みしてください...数回することで、すべての時間が費やされている場所を知ることができます。 –

関連する問題