【问题标题】:How to time each line of a MatLab script?如何对 MatLab 脚本的每一行进行计时?
【发布时间】: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


【解决方案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 中找到计时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多