假设我们有一个循环:
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
?
有没有办法避免可怕的丑陋复制?
答案 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
中找到时间。