在我们编写Matlab程序时,对于函数或循环的使用不当会造成严重的性能浪费,从而降低我们的工作和学习效率,有时想要优化代码却发现无从下手。
这里介绍Matlab自带的Profiler工具,可以让我们一键分析代码各部分的耗时,方便针对性的修改和优化。
Profiler介绍
在Matlab中有三种调用Profiler工具的方法:
1. 在HOME(主页)选项卡,选择Run and Time(运行并计时)选项。
2. 在EDITOR(编辑器)选项卡,选择Profiler(分析器)选项。
3. 直接在命令行键入“profiler”。
在Profiler界面位置1处选择或键入需要分析的程序文件名称,点击位置2处的Run and Time(运行并计时)选项即可对程序进行分析。
示例
这里以一个简单的问题为例:
创建一个5000x5000的随机数矩阵A;
创建同样尺寸的矩阵B,将矩阵A中大于1的元素直接赋值给B,小于1的元素求负数后赋值给B。
初始代码:
clc,clear
tic
num = 5000;
for i = 1:num
for j = 1:num
A(i,j) = rand;
if (A(i,j) > 1)
B(i,j) = A(i,j);
else
B(i,j) = -A(i,j);
end
end
end
toc
运行耗时99s(与计算机配置有关)。
使用Profile进行性能分析:
可以看到最耗时的部分集中在为A和B赋值的部分,这是由于我们没有实现分配内存,使得每次赋值后矩阵A和B的尺寸都发生了变化,总共进行了2500万次,因此损失了大量性能。
第一次优化
找到了问题的原因后对代码进行初步修改,提前为矩阵A、B分配内存。
clc,clear
tic
num = 5000;
B = zeros(num);
A = rand(num);
for i = 1:num
for j = 1:num
if (A(i,j) > 1)
B(i,j) = A(i,j);
else
B(i,j) = -A(i,j);
end
end
end
toc
运行耗时1s(与计算机配置有关)。
可以看到修改后运行效率的提升非常明显,但是否还有进一步的优化空间呢?我们继续使用Profiler分析一下。
从分析结果来看,虽然运行耗时已经大大减少,但是if-else的判断语句仍占用了大量的时间。
第二次优化
利用Matlab的矩阵特性进行进一步的优化:
clc,clear
tic
num = 5000;
A = rand(num);
B = A;
B(A<=1) = -A(A<=1);
toc
运行耗时0.45s(与计算机配置有关)
性能得到了进一步的提升,再使用Profiler分析一下:
可以看到所有语句均只执行了1次,性能已经可以满足需求。
—— end ——
联系客服