MATLAB Answers

What is the difference between the effect of clear and clearvars?

176 views (last 30 days)
mutt on 29 Jan 2013
Edited: Walter Roberson on 1 Aug 2021
What is the difference between the effect of clear and clearvars?
  1 Comment
Jan on 29 Jan 2013
I love to see, that somebody cares about the details of the clear command, because I've seen too many clear all without any use.

Sign in to comment.

Accepted Answer

Shashank Prasanna
Shashank Prasanna on 29 Jan 2013
clearvars just clears variables you specify, in the way you specify.
clear is more powerful in the sense you can clear variables, variables, functions, compiled scripts, MEX-functions
Check our the doc for more info:
Stephen on 30 Jul 2021
@Kien Pham: the question is rather moot: well-written code should very very rarely require clearing any variables:
Although popular with beginners, trying to micro-manage the MATLAB memory management often just impedes the JIT optimization.

Sign in to comment.

More Answers (2)

Jab re
Jab re on 19 Jan 2017
if you define a global variable, clearvars will remove it as well, however, somehow its value is still accessible in the memory and next time you define a global variable with the same name, the value of the previously removed variable will be assigned to the new one! Which is very strange!
global Test
Test = 10;
if you check the workspace after above, you will see there is no variable called Test at this point, however:
global Test
Now Test has a value of 10 again! This strange behavior does not happen if you use clear all to remove the variables.
I am not sure if it is a bug or something designed, but clearvars did cause me problems and I found it the hard way!
DZ on 29 Jul 2021
Because you need the (-)global flag to remove global variables. Or you can make your example an implicit complaint about the lack of alternative to global variables.

Sign in to comment.

Walter Roberson
Walter Roberson on 30 Jul 2021
@Kien Pham asked above whether there was a timing difference between clear and clearvars.
The answer astonished me: there is a big timing difference between the two!!
In the below code, I generate random assignment statements and write them to files. The files differ only in function name, and in whether they use "clear" or "clearvars" or have no clearing (keeping in mind that local variables are supposedly cleared when a function returns, so using a function is another form of clearing.)
Because the exact same assignment statements are used, there will be differences between the variations due to differences in how long the clearing takes; there should also be normal execution variances, so if the values are close then it is worth testing repeatedly to see if any particular relative order is accidental.
Note that it would normally be expected by programmers that the great majority of the execution time would be due to the assignment statements. Programmers tend to expect that clearing variables is fast. Mathworks does however warn that if you have a loop with a local variable that is being overwritten, then clearing the local variable is not good for performance
The results are:
  • not clearing is fastest
  • using "clear" is about 14 times slower -- too much difference for it to be due to chance
  • using "clearvars" is much slower. In this test, 25000 times slower!! And I could tell from my tests that the time taken is proportional to roughly the square of the number of variables !!
When I analyze the code for clearvars, I can see that in the case that no argument is provided, that it would execute
evalin('caller', 'clear -regexp ^.')
which tells us that the problem isn't exactly with clearvars, but rather that the speed problem is when using clear with -regexp .
The poor performance in this case is astounding, and I will create a support case about it.
N = 12000;
tn = tempname;
tn1 = tn + "clear.m";
tn2 = tn + "clearvars.m";
tn3 = tn + "noclear.m";
[folder, fn1, ext] = fileparts(tn1);
[~, fn2, ~] = fileparts(tn2);
[~, fn3, ~] = fileparts(tn3);
[fid1, msg] = fopen(tn1, 'w');
if fid1 < 0; error('Failed to open file "%s" because "%s"', tn1, msg); end
cleanme1 = onCleanup(@()delete(tn1));
[fid2, msg] = fopen(tn2, 'w');
if fid2 < 0; error('Failed to open file "%s" because "%s"', tn2, msg); end
cleanme2 = onCleanup(@()delete(tn2));
[fid3, msg] = fopen(tn3, 'w');
if fid3 < 0; error('Failed to open file "%s" because "%s"', tn3, msg); end
cleanme3 = onCleanup(@()delete(tn3));
fprintf(fid1, "function %s\n", fn1);
fprintf(fid2, "function %s\n", fn2);
fprintf(fid3, "function %s\n", fn3);
AL = 'A':'Z';
rn = AL(randi(length(AL), N, 62));
rv = compose(" = %.15g;", rand(N,1));
rl = rn + rv;
fprintf(fid1, "%s\n", rl);
fprintf(fid2, "%s\n", rl);
fprintf(fid3, "%s\n", rl);
fprintf(fid1, "\nclear\n");
fprintf(fid2, "\nclearvars\n");
fprintf(fid3, "\n");
fclose(fid1); fclose(fid2); fclose(fid3);
clear(fn1); clear(fn2); clear(fn3); %needed because m files were modified
. hsperfdata_wguser tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90noclear.m .. jetty- Editor_yhfth matlabpref GDS-CACHE tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clear.m hsperfdata_mcguser tp06f0eb7b_8a00_4a71_9ec0_ee7b62775d90clearvars.m
fh1 = str2func(fn1);
fh2 = str2func(fn2);
fh3 = str2func(fn3);
fprintf('timing with clear\n');
timing with clear
timeit(fh1, 0)
ans = 0.0043
fprintf('timing with clearvars\n');
timing with clearvars
timeit(fh2, 0)
ans = 8.2146
fprintf('timing with no clear or clearvars\n');
timing with no clear or clearvars
timeit(fh3, 0)
ans = 2.9454e-04
Jan on 1 Aug 2021
Thanks for this detailed explanation. It would be useful to find such hints in doc clervars .

Sign in to comment.


Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!