如何计算MatLab脚本的每一行?

时间:2017-05-11 08:38:42

标签: matlab optimization profiling benchmarking

假设我们有一个循环:

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

... with:

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

有没有办法避免可怕的丑陋复制?

1 个答案:

答案 0 :(得分:1)

处理此问题的classdef怎么样?

您可以将其另存为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

然后,您可以使用T=mtime();进行初始化并通过调用time(T);为您的代码计时。代码完成后,可以在T.times中找到时间。