clear和clearvars的效果有什么区别?

218次浏览(最近30天)
杂种狗
杂种狗 2013年1月29日
编辑: 沃尔特·罗伯森 早在14 horas之前
clear和clearvars的效果有什么区别?
1评论
1月
1月 2013年1月29日
我喜欢看到,有人关心细节 清晰的 命令,因为我见过太多了 清除所有 没有任何使用。

登录评论。

接受的答案

沙Prasanna
沙Prasanna 2013年1月29日
Clearvars只是以你指定的方式清除你指定的变量。
clear功能更强大,可以清除变量、变量、函数、编译脚本和mex -函数
查看我们的文档获取更多信息:
2的评论
Stephen Cobeldick
Stephen Cobeldick 2021年7月30日7:30
@Kien Pham:这个问题很有争议:写得好的代码应该很少需要清除任何变量:
尽管在初学者中很流行,但尝试微管理MATLAB内存管理通常只会阻碍JIT优化。

登录评论。

更多的答案(2)

注射再保险
注射再保险 2017年1月19日
如果你定义了一个全局变量,clearvars也会删除它,然而,它的值仍然可以在内存中访问,下一次你定义一个同名的全局变量时,之前删除的变量的值将被分配给新的变量!这很奇怪!
全球测试
测试= 10;
clearvars
如果你在上面的工作空间之后检查,你会看到这里没有名为Test的变量,但是:
全球测试
显示器(测试)
现在Test的值又变成了10 !如果您使用clear all来删除变量,则不会发生这种奇怪的行为。
我不确定这是否是一个bug或设计的东西,但clearvars确实给我带来了问题,我发现了它的艰难方式!
4评论
DZ
DZ 2021年7月29日23:00
因为需要使用(-)全局标志来删除全局变量。或者您可以让您的示例隐含地抱怨缺少全局变量的替代方法。

登录评论。


沃尔特·罗伯森
沃尔特·罗伯森 2021年7月30日7点07分
@Kien范教授 在上面的问题中,清牌和清牌之间是否有时间上的差异。
答案使我吃惊:有一个 两者的时间差!!
在下面的代码中,我生成了随机赋值语句并将它们写入文件。这些文件的区别仅在于函数名,以及它们是否使用“clear”或“clearvars”或不进行清除(记住,当函数返回时,局部变量应该被清除,因此使用函数是另一种形式的清除)。
因为使用了完全相同的赋值语句,所以由于清除所需时间的不同,变体之间会存在差异;也应该有正常的执行差异,所以如果值很接近,那么值得重复测试,看看是否有任何特定的相对顺序是偶然的。
请注意,程序员通常认为绝大多数执行时间都是由赋值语句引起的。程序员往往期望清除变量的速度很快。Mathworks 但是,请注意,如果您的循环中有一个局部变量正在被覆盖,那么清除该局部变量不利于性能
结果是:
  • 不清理是最快的
  • 使用“clear”的速度要慢14倍——这种差别太大了,不可能是偶然的
  • 使用“clearvars”慢。在这个测试中,慢了25000倍!!我可以从我的测试中看出,所花费的时间大致与变量数量的平方成正比!!
当我分析clearvars的代码时,我可以看到,在没有提供参数的情况下,它将执行
Evalin ('caller', 'clear -regexp ^.')
也就是说问题不在这里 完全 使用clearvars,而不是使用-regexp时的速度问题。
在这种情况下,糟糕的表现令人震惊,我将创建一个支持案例。万博1manbetx
N = 12000;
tn = tempname;
tn = tn +“clear.m”
tn = tn +“clearvars.m”
tn = tn +“noclear.m”
[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));
流(fid1“函数% s \ n”, fn1);
流(fid2“函数% s \ n”, fn2);
流(fid3“函数% s \ n”, fn3);
艾尔=“一个”“Z”
rn = AL(randi(length(AL), N, 62));
房车=组成(“= % .15g;”,兰德(N - 1));
Rl = rn + rv;
流(fid1“% s \ n”、rl);
流(fid2“% s \ n”、rl);
流(fid3“% s \ n”、rl);
流(fid1“\ nclear \ n”);
流(fid2“\ nclearvars \ n”);
流(fid3“\ n”);
文件关闭(fid1);文件关闭(fid2);文件关闭(fid3);
明确(fn1);明确(fn2);明确(fn3);%,因为修改了m个文件
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
fh1 = str2func (fn1);
fh2中= str2func (fn2);
fh3 = str2func (fn3);
流(“时间明确\ n”);
时间有明确的
时间(fh1, 0)
ans = 0.0043
流(“时间与clearvars \ n”);
时间与clearvars
时间(fh2中,0)
ans = 8.2146
流('timing with no clear or clearvar \n');
时机没有明确或明确
时间(fh3, 0)
ans = 2.9454 e-04
5个评论
1月
1月 23 horas ago
谢谢你的详细解释。在书中找到这样的提示是很有用的 医生clervars。

登录评论。

标签

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!

翻译的