【仿真基本功】【MATLAB】计时详解:五种计时方法的使用建议使用方法、基本优缺点

时间:2024-11-21 08:21:06

MATLAB的计时工具是提高程序运行效率的关键辅助工具,但本人每次使用时总是需要重新查询使用方法,且以往的个人使用经验也常常因为间隔时间过长而需要重新积累。为了避免这一问题,因此决定在此一并整理好,自己可用也造福大家。内容难免存在错误和不足,欢迎各位批评指正。如果觉得有用,不妨点个赞哟~

MATLAB计时

  • 一、五种计时方法的使用建议
  • 二、具体使用方法及基本优缺点
    • 1. 命令历史记录窗口的执行时间显示
    • 2. 编辑器的“运行并计时”工具
    • 3. “tic + toc”组合
    • 4. “clock + etime”组合
    • 5. “cputime”: CPU time
  • 三、后三种计时方法的耗时对比(MATLAB程序)

MATLAB自带了五种计时工具,分别是命令历史记录中的“显示执行时间”、编辑器的“运行并计时”模块、“tic+toc”组合、“clock+etime”组合以及“cputime”。下面就一一介绍这几种方法。

一、五种计时方法的使用建议

为了便于大家阅读使用,直接放结论。如需具体的使用方法和分析,可以再往下看。

序号 计时方法 使用建议
1 命令历史记录窗口显示执行时间 简单设置后常开即可
2 编辑器的“运行并计时”工具 仅关心各函数执行时间时可用
3 “tic+toc”组合 关心某一段程序而非具体函数的执行时间时可用,且此时建议优先使用该方法
4 “clock+etime”组合 关心某一段程序而非具体函数的执行时间时可用,数据按“年、月、日、时、分、秒”排列,易于理解,但耗时长于“tic+toc”组合。仅为计时时不建议使用
5 “cputime” 输出的是CPU时间,单位不是秒且不是现实时间,不建议使用

二、具体使用方法及基本优缺点

1. 命令历史记录窗口的执行时间显示

使用方法:在“预设”中选择“命令历史记录”,勾选“显示执行时间”即可显示每个历史程序的执行时间。
优点:勾选一次即可,无需额外设置,无额外耗时。
缺点:只能显示当前程序的总时长,没有更细致的时间显示。

2. 编辑器的“运行并计时”工具

使用方法:最常见的计时工具就是编辑器自带的“运行并计时”工具,点击即可运行并输出各函数的运行时间。
优点:该工具直接统计各函数(包括主函数)使用时间,有助于观察程序中函数运行时间,进而找到瓶颈。
缺点:不便于直接统计某一段程序的运行时长。

3. “tic + toc”组合

使用方法:在需要开始计时的位置输入“tic;”,在结束计时的位置输入“toc;”即可。这里的“toc”是程序从“tic”开始到“toc”的实际运行时间,以秒为单位。因此,如果要统计某一循环中的某一段程序的总运行时间,可以累加“toc”的值。示例如下:

t = 0;
for cycle_no = 1: 10
    tic;
    pause(0.1); % 要统计时间的代码,这里以暂停0.1秒的程序为例
    t = t + toc; % toc是从tic处开始到此处的、以秒为单位的时长
    pause(0.2);  % 其他代码,这里以暂停0.2秒的程序为例
end
% 运行结束时,t = 1.0359

如果涉及到tic、toc的嵌套,可以使用下述方法来避免tic、toc的匹配混淆:

t0 = tic;
pause(1)
t1 = tic;
pause(1)
toc(t1); % 从t1开始到此处的执行时间
pause(1)
toc(t0); % 从t0开始到此处的执行时间
% 运行结果:
% 时间已过 1.017749 秒。
% 时间已过 3.029855 秒。
% 
% 注:若不把“toc”赋值给某个变量,将直接输出显示已过时间,例如本例。详细内容可使用“edit toc”了解。

如果涉及对循环中的某个步骤计时,可以使用下述方法:

t_delay = 0.1;
tCount1 = 0;
t0 = tic;
for i = 1:10
	for j = 1:10
		pause(t_delay)
		t1 = tic;
		pause(t_delay)
		tCount1 = tCount1 + toc(t1); % 从t1开始到此处的执行时间
    end
end
tCount0 = toc(t0); % 从t0开始到此处的执行时间
fprintf(['Time 0 is ', num2str(tCount0), ' seconds.\n'])
fprintf(['Time 1 is ', num2str(tCount1), ' seconds.\n'])
% 运行结果:
% Time 0 is 21.7805 seconds.
% Time 1 is 10.8958 seconds.

优点:① 可以统计某一段程序的总耗时,② 计时程序本身带来的额外耗时相对于后两种方法都要少。
缺点:需要额外耗时。

4. “clock + etime”组合

使用方法:clock记录的是当前时刻,形式为一个1x6维的double向量,如"[2020, 9, 30, 16, 25, 29. 1760]",几个数据依次代表年、月、日、时、分、秒。使用时,在需要开始计时的位置输入“t1 = clock;”,在结束计时的位置输入“t2 = clock;”,用“etime(t2, t1)”即可得到二者的时间差,单位为秒。示例如下:

t = 0;
for cycle_no = 1: 10
    t1 = clock;
    pause(0.1); % 要统计时间的代码
    t2 = clock;
    t = t + etime(t2, t1); % 这两行代码也可直接简化为“t = t + etime(clock, t1);”
    pause(0.2);  % 其他代码
end
% 运行结束时,t = 1.0530,耗时略长于“tic +toc”组合

优点:① 可以统计某一段程序的耗时,② clock的结果明显易懂,便于时刻的提取。
缺点:需要额外耗时,且额外耗时长于“tic +toc”组合,为“tic + toc”组合的15倍左右。(倍数由多次仿真得出,相应程序附在第三部分)

5. “cputime”: CPU time

使用方法:“cputime”输出的是CPU时间,而非现实时间,即单位不是秒。使用时,在需要开始计时的位置输入“t1 = cputime;”,在结束计时的位置输入“t2 = cputime;”,用“t2 - t1”即可得到二者的时间差。示例如下:

t = 0;
for cycle_no = 1: 10
    t1 = cputime;
    pause(0.1); % 要统计时间的代码
    t2 = cputime;
    t = t + t2 - t1; % 这两行代码也可直接简化为“t = t + cputime - t1;”
    pause(0.2);  % 其他代码
end
% 运行结束时,t = 0.1406

由 t < 1 也可以看出,CPU时间和真实时间不相同
优点:可以统计某一段程序的耗时。(目前尚未发现这一方法的其他用途。)
缺点:① CPU时间和真实时间不相同,② 需要额外耗时,且额外耗时长于“tic +toc”组合,为“tic + toc”组合的5倍左右。(倍数由多次仿真得出,相应程序附在第三部分)

三、后三种计时方法的耗时对比(MATLAB程序)

%% Three Methods of Timing: Time Consuming Comparison
%Results
% Method 1: tic + toc
  Speed: fast
  Weakness: each `toc` only match with its exactly last 'tic'
Method 2: clock + etime
  Speed: medium, around 1/15 of Method 1
  Weakness: just slow
Method 3: cputime
  Speed: medium, around 1/5 of Method 1
  Weakness: cputime is not the real time we use in daily life

  
N = 1e6;

% Method 1: tic + toc
a = tic;
t1 = 0;
for i = 1: N
    tic;
    t1 = t1 + toc;
end
toc(a);

% Method 2: clock + etime
b = tic;
t2 = 0;
for i = 1: N
    t0 = clock;
    t2 = t2 + etime(clock, t0);
end
toc(b);

% Method 3: cputime
c = tic;
t3 = 0;
for i = 1: N
    t0 = cputime;
    t3 = t3 + cputime - t0;
end
toc(c);

% 运行结果:
% 时间已过 0.594472 秒。
% 时间已过 9.540728 秒。
% 时间已过 3.595892 秒。