たちはループがあるとします。MatLabスクリプトの各行の時間を計測する方法は?
for i = 1:1000
A
B
C
end
を...と私は、CPUの使用率の広がりを見つけることを望みます。
A、B、Cは関数ではないMatLabステートメントなので、(IIUC)プロファイラは使用できません。
また、現実には、カバーするダースラインがあります。
明らかに長いったらしい方法は次のようになります。あまりにも悪くないです
s = zeros(50, 1);
t = cputime;
for ...
A
s(1) = s(1) + (cputime-t); t = cputime;
B
s(2) = s(2) + (cputime-t); t = cputime;
:
を...、私は考えます。
しかし、それを改善することはできますか?
私はやって考える:で...
t = zeros(50, 1);
e(t,0); % reset
for i = 1:1000
A
e(1);
B
e(2);
C
e(3);
end
:
function e(t, k)
if k==0
last_cputime = cputime;
return
end
t(k) = t(k) + (cputime-last_cputime);
last_cputime = cputime;
end
しかし、それはt
を見ていないので、私はそれを渡す必要があります。
また、呼び出し間にlast_cputime
が覚えていないので、私もそれを渡す必要があります。
のでe(last_cputime,t,1)
それはかなり醜いです。私は、インライン関数で使用して実験した:
e = @(k) eval('t(k) = t(k) + (cputime-last_cputime); cputime = last_cputime;');
をしかし、私は、これはどちらかの作業をすることができませんでした:
K>> t = zeros(3,1)
t =
0
0
0
K>> eval('t(1) = 3')
t =
3
0
0
K>> e = @(k) eval('t(k) = 3;')
e =
function_handle with value:
@(k)eval('t(k) = 3;')
K>> e(1)
Attempt to add "t" to a static workspace.
See Variables in Nested and Anonymous Functions.
Error in pi_test>@(k)eval('t(k) = 3;')
別のオプションがあるかもしれない場合、私は疑問に思う:
for i = 1:1000
e('A');
e('B');
e('C');
end
しかし、どのようにコード化するe
?
恐ろしい醜さから重複を避ける方法はありますか?
Threは、「実行と時間」と呼ばれる大きなボタンです。各行の時間だけでなく、プロットやパーセンテージなどのヒストグラムも表示します。プロファイラはmatlabステートメントを含むすべての時間を計測します –
プロファイラに関するあなたの声明:プロファイラは、式の実行時間も測定します。もちろん、ループ内の各行の実行ごとに実行時間が集計され、情報全体の実行時間とその行の実行回数だけが取得されます。異なる繰り返しの実行時間を比較する必要がありますか?または、なぜプロファイラ情報があなたにとって不十分なのですか? – souty