答案使我吃惊:有一个
大
两者的时间差!!
在下面的代码中,我生成了随机赋值语句并将它们写入文件。这些文件的区别仅在于函数名,以及它们是否使用“clear”或“clearvars”或不进行清除(记住,当函数返回时,局部变量应该被清除,因此使用函数是另一种形式的清除)。
因为使用了完全相同的赋值语句,所以由于清除所需时间的不同,变体之间会存在差异;也应该有正常的执行差异,所以如果值很接近,那么值得重复测试,看看是否有任何特定的相对顺序是偶然的。
请注意,程序员通常认为绝大多数执行时间都是由赋值语句引起的。程序员往往期望清除变量的速度很快。Mathworks
做
但是,请注意,如果您的循环中有一个局部变量正在被覆盖,那么清除该局部变量不利于性能
结果是:
- 不清理是最快的
- 使用“clear”的速度要慢14倍——这种差别太大了,不可能是偶然的
- 使用“clearvars”多慢。在这个测试中,慢了25000倍!!我可以从我的测试中看出,所花费的时间大致与变量数量的平方成正比!!
当我分析clearvars的代码时,我可以看到,在没有提供参数的情况下,它将执行
Evalin ('caller', 'clear -regexp ^.')
也就是说问题不在这里
完全
使用clearvars,而不是使用-regexp时的速度问题。
在这种情况下,糟糕的表现令人震惊,我将创建一个支持案例。万博1manbetx
[folder, fn1, ext] = fileparts(tn1);
[~, fn2, ~] = fileparts(tn2);
[~, fn3, ~] = fileparts(tn3);
[fi1, msg] = fopen(tn1,' w ');
如果fid1 < 0;错误(“打开文件“%s”失败,因为“%s”、tn1 msg);结束
cleanme1 = onCleanup(@()删除(tn1));
[font =宋体][font =宋体]' w ');
如果fid2 < 0;错误(“打开文件“%s”失败,因为“%s”、tn2 msg);结束
cleanme2 = onCleanup(@()删除(tn2));
[fi3, msg] = fopen(tn3, msg)' w ');
如果fid3 < 0;错误(“打开文件“%s”失败,因为“%s”、tn3 msg);结束
cleanme3 = onCleanup(@()删除(tn3));
rn = AL(randi(length(AL), N, 62));
房车=组成(“= % .15g;”,兰德(N - 1));
流(fid2“\ nclearvars \ n”);
文件关闭(fid1);文件关闭(fid2);文件关闭(fid3);
dir(文件夹)
.hsperfdata_wguser tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90noclear。m . .jetty - 0.0.0.0 - 8080工人- webapp -_-any工人。属性Editor_yhfth matlabpref ws_override属性GDS-CACHE tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clear。m hsperfdata_mcguser tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clearvars.m
(fn1)
/ tmp / tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clear.m
(fn2)
/ tmp / tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clearvars.m
(fn3)
/ tmp / tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90noclear.m
流('timing with no clear or clearvar \n');