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 秒。