2017-05-11 16 views
1

たちはループがあるとします。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

恐ろしい醜さから重複を避ける方法はありますか?

+0

Threは、「実行と時間」と呼ばれる大きなボタンです。各行の時間だけでなく、プロットやパーセンテージなどのヒストグラムも表示します。プロファイラはmatlabステートメントを含むすべての時間を計測します –

+0

プロファイラに関するあなたの声明:プロファイラは、式の実行時間も測定します。もちろん、ループ内の各行の実行ごとに実行時間が集計され、情報全体の実行時間とその行の実行回数だけが取得されます。異なる繰り返しの実行時間を比較する必要がありますか?または、なぜプロファイラ情報があなたにとって不十分なのですか? – souty

答えて

1

これを処理するclassdefはどうですか?

あなたはコードがタイミングがT.timesで見つけることができます終了した後time(T);を呼び出すことによって、あなたはその後、T=mtime();と時間、あなたのコードでintializeできmtime.m

classdef mtime < handle 
    properties 
     times 
    end 
    properties (Access = private) 
     t 
    end 

    methods 
     function obj = mtime() %initialize 
      obj.t=cputime; 
      obj.times=[]; 
     end 
     function time(obj) 
      obj.times(end+1) = cputime-obj.t; 
      obj.t = cputime; 
     end 
    end 
end 

としてこれを保存することができます。

関連する問題