打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一键定位降低Matlab代码性能的“元凶”
userphoto

2023.05.30 江苏

关注

在我们编写Matlab程序时,对于函数或循环的使用不当会造成严重的性能浪费,从而降低我们的工作和学习效率,有时想要优化代码却发现无从下手。

这里介绍Matlab自带的Profiler工具,可以让我们一键分析代码各部分的耗时,方便针对性的修改和优化。

01

Profiler介绍

在Matlab中有三种调用Profiler工具的方法:

1. 在HOME(主页)选项卡,选择Run and Time(运行并计时)选项。

2. 在EDITOR(编辑器)选项卡,选择Profiler(分析器)选项。

3. 直接在命令行键入“profiler”。

在Profiler界面位置1处选择或键入需要分析的程序文件名称,点击位置2处的Run and Time(运行并计时)选项即可对程序进行分析。

02

示例

这里以一个简单的问题为例:

  • 创建一个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 ——

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
矩阵计算-MATLAB-doolittle分解
科学网—Matlab最快的矩阵列向量归一化方法
加速MATLAB运行效率的知识和体会
附录C Matlab算法示例
MATLAB《自动控制原理》相关编程
好消息!Matlab R2023a正式发布!附安装包下载资源!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服