【发布时间】:2017-05-11 08:38:42
【问题描述】:
假设我们有一个循环:
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?
有什么办法可以避免通过重复造成可怕的丑陋吗?
【问题讨论】:
-
编辑器中有一个名为“运行和时间”的大按钮,它不仅可以为每一行计时,还可以为您提供图表和百分比等直方图。分析器会为所有内容计时,包括 matlab陈述
-
只是对您关于分析器的陈述感到好奇:分析器还测量表达式的执行时间。当然,对于循环中一行的每次运行,执行时间都会被汇总,您只能获得总体执行时间和该行执行频率的信息。您是否需要比较不同迭代的执行时间?或者为什么分析器信息对您来说不够用?
标签: matlab optimization profiling benchmarking