Reprinted from T heMathWorksNews&Notes | June 2007 | www.mathworks.com
it at a point larger than the current size. is approach is con-
venient for quick prototyping of code, but each time you use it,
MATLAB must allocate memory for a new larger array and
then copy the existing data into it. Code that repeats this proce-
dure several times, as in a loop, is slow and inecient.
In one step, code segment 2 preallocates the entire array x
to the largest size that it needs to be. No more memory alloca-
tion is then required during the execution of the code. If the
M-Lint code checker nds an opportunity to preallocate, it
issues a warning.
Fortunately, with a little knowledge of how MATLAB stores
and accesses data, you can avoid inecient memory usage and
improve the speed of your code.
is article describes three ways to improve the performance
of memory-bound code:
• Preallocate arrays before accessing them within loops
• Store and access data in columns
• Avoid creating unnecessary variables
In each case we will compare the execution speed of a code
segment before and aer applying the technique. To ensure
the best performance, the code segments are all timed in func-
tion M-les, not script M-les. As memory performance is
machine-dependent, the performance tests were carried out
on two dierent machines
1
.
Preallocate Arrays Before Accessing them
Within Loops
When creating or repeatedly modifying arrays within loops, al-
ways allocate the arrays beforehand. Of all three techniques, this
familiar one can give the biggest performance improvement.
e code segments in Figure 1 use a for loop to calculate a
sequence of numbers based on the equation, x(k) = 1.05* x(k-1),
equal to the annual balance of a bank account earning a 5%
interest rate.
Why Code Segment 2 is Faster
e MATLAB language does not require you to declare the
types and sizes of variables before you use them. As a result,
you can increase the size of an array merely by indexing into
T heMathWorksNews&Notes
Maximizing Code Performance by
Optimizing Memory Access
BY STUART MCGARRITY
Programming
PATTERNS
Most MATLAB
®
users want their code to be fast, especially when it is processing very large
data sets. Because memory performance has not increased at the same rate as CPU
performance, code today is often “memory-bound,” its overall performance limited by the
time it takes to access memory.
1 Machine A is a Lenovo T60 inkPad, 1.83GHz Intel Core Duo T2400 processor, 2MB L2 cache, 2GB RAM, 32-bit Windows XP.
Machine B is a Dual 2.1GHz AMD Opteron 248 processor machine , 1MB L2 Cache, 1GB RAM, 64-bit Linux.
N = 10e3;
x(1)=1000;
for k=2:N
x(k)=1.05*x(k-1);
end
Machine A = 0.1409 sec
Machine B = 0.1281 sec
N = 10e3;
x=zeros(N,1); %Preal-
locate
x(1)=1000;
for k=2:N
x(k)=1.05*x(k-1);
end
Machine A = 0.00024 sec
Machine B = 0.00027 sec
Code segment 1 Code segment 2
Figure 1. Preallocating arrays. Code segment 2 executes in 99.8%
less time (580 times faster) than segment 1 on machine A, and in
99.7% less time (475 times faster) than segment 1 on machine B.