提高Matlab仿真程序执行性能

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tic for i=1:1000000 funci(i); end toc Mean elapsed time is 19.5606 seconds.
funci=inline('','x');
影响仿真程序性能的因素——函数调用
影响仿真程序性能的因素——函数调用
从上面的实验结果可以得出以下结论: 内联函数的调用时间开销最小,约为for-loop本身的10倍 m-函数的调用时间开销约为内联函数的6倍,约为for-
大多数情况下,执行效率的低下,是由于我们忽 视了一些影响仿真程序性能的因素导致的
影响仿真程序性能的因素
For-循环 函数调用 内存分配 矩阵索引 其它
影响仿真程序性能的因素——For循环
传统观点认为for-loop是影响性能的致命环节,让我 们来对此验证:
tic toc Elapsed time is 0.000001 seconds. tic for i=1:1000000 end Toc Elapsed time is 0.003144 seconds.
提高Matlab仿真程序执行性 能
正文结构
背景与意义 影响仿真程序性能的因素 提高仿真程序性能的建议 执行速度测试方法
背景与意义
Matlab与其他语言的差异: 例如对于C或者C++来说,只要算法的思想不变、采用的
数据结构相同,不同人写出来的语句在效率上一般不会产 生太大的差别。所以,对于C来说,程序的好坏一般由算 法来决定。 但是,在Matlab中,同样的算法、同样的结构、同样的 流程,如果采用的语句不一样,在效率上就会大大不同。 所以,了解有关Matlab执行效率的内容,对我们的接下 来的仿真实践会有很多帮助。
影响仿真程序性能的因素——For循环
从上面的实验结果可以得出以下结论: tic/toc语句的时间开销可以忽略不计 for-loop语句本身的时间开销也非常小,关键的影响效
率的地方不在于循环本身,而是在于循环的内部
接下来我们就借助for循环,分析一下其他的各个影响效率 的因素
影响仿真程序性能的因素——函数调用
影响仿真程序性能的因素——内存分配
因此,如果不预先分配好内存,将会大大增加仿真时间, 拖慢执行效率;
所幸的是,由于这个现象的重要性,Matlab的编辑器能 够发现并提示这个问题,会用红的波浪线标记出来
影响仿真程序性能的因素——其它
关于Matlab还有很多细节及技巧,可以通过在程序中查 询产品帮助,获得设计师的建议,一点一点积累
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i,1)=i; end toc Mean elapsed time is 0.007954 seconds.
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i:i,1)=i; end toc Mean elapsed time is 0.663598 seconds.
影响仿真程序性能的因素
很多书上都说Matlab是解释性语言,执行效率不 如C/C++高。这曾令我对Matlab的执行速度失去 信心;
然而这句话虽然是正确的,却非常不全面,导致 我们将速度慢的原因归咎于工具语言本身;
实际上,Matlab通过借助混合编程的方法,其执 行效率与编译型语言之间的差别已经不是很明显;
tic A=zeros(1000000,1); for i=1:1000000 A(i)=i; end toc Mean elapsed time is 0.009025 seconds.
影响仿真程序性能的因素——内存分配
tic % A=zeros(1000000,1); for i=1:1000000 A(i)=i; end toc Mean elapsed time > 20 minutes.
提高仿真程序性能的建议——向量化
Y=arrayfun(function, X);
向量化函数: accumarray arrayfun bsxfun cellfun spfun structfun
提高仿真程序性能的建议——函数化
尽量使用内建函数,内建函数的速度是最快的 m-函数的执行效率也很高 MEX-函数的执行效率仅次于内建函数,将耗时的代码写
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i,:)=i; end toc Mean elapsed time is 0.273345 seconds.
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i,1:1)=i; end toc Mean elapsed time is 0.730042 seconds.
i= 2
i= 7
i= 11
附:for-loop中的循环变量
N=[2 7 11;1 5 13]; for i=N i Hale Waihona Puke Baiduend
i= 2 1
i= 7 5
i= 11 13
免每次临时扩充维数 重用变量,避免生成大的中间变量,并删除不再需要的临
时变量 当程序需要生成大量数据时,可以考虑定期将变量写到磁
盘,然后清除这些变量。 当需要这些变量时,再重新从 磁盘加载 当矩阵中数据极少时,将全矩阵转换为稀疏矩阵 clear, save, load, whos, pack
常用的预分配内存函数: zeros ones eye
执行速度测试方法
tic/toc语句 profile函数 profiler工具
执行速度测试方法——tic/toc语句
tic/toc语句,前面已经介绍了实例。 tic/toc不一定要成对出现,一个tic后面可
以有多个toc,但需要需要重新计时的时候, 要再次执行tic toc的结果可以用变量接收下来,如 T=toc T(k)=toc;
loop本身的60倍 匿名函数的调用时间开销约为m-函数的3倍,约为for-
loop本身的187倍 内联函数的调用时间开销过大,尽量不要在循环中使用 另外MEX-函数的调用时间开销,理应介于内联函数和m-
函数之间
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i)=i; end toc Mean elapsed time is 0.007592 seconds.
执行速度测试方法——profile函数
运行到断点 pro 单步执行 pro pro pro
对于在一大堆语句中单独调用的m文件,如果你仅仅需要用matlab 观察这个函数的耗时,那么用断点运行到你需要查看的函数之前,然 后按照上面仿真单个文件的方法,在命令行窗口执行pro,然后调用 函数, 接下来用pro查看报告,最后输入pro结束。
function func( ~ ) end
影响仿真程序性能的因素——匿名函数
tic for i=1:1000000 funca(i); end toc Mean elapsed time is 0.561228 seconds.
funca=@(x)'';
影响仿真程序性能的因素——内联函数
函数的分类: build-in function MEX-function ("MATLAB executable") m-function anonymous function inline function 其它相关内容(不讲): function handle feval
影响仿真程序性能的因素——内建函数
影响仿真程序性能的因素——矩阵索引
tic A=zeros(1000000,1); for i=1:1000000 A(i:i,1:1)=i; end toc Mean elapsed time is 1.00852 seconds.
影响仿真程序性能的因素——矩阵索引
影响仿真程序性能的因素——内存分配
下面列举一些编程的建议
提高仿真程序性能的建议
向量化 函数化 预分配内存 随时用测试工具检测执行效率
提高仿真程序性能的建议——向量化
N=0:0.1:1000; for i=0:10000 y(i)=cos(N(i)); end 向量化: N=0:0.1:1000; y=cos(N);
tic for i=1:1000000 cos(0); end toc Mean elapsed time is 0.032866 seconds.
影响仿真程序性能的因素——m-函数
tic for i=1:1000000 func(i); end toc Mean elapsed time is 0.185556 seconds.
执行速度测试方法——profile函数
pro script-name pro pro pro
对于单个m文件,你只需要简单的在Matlab 命令行窗口 (Command Window)输入pro,然后是m文件名,比如文件名为 calculation.m的文件,直接输入calculation,执行完毕以后,输入 pro,就可以观察每条语句的耗时。结束后别忘了pro。还可以使用 pro清除之前执行的结果。
附:for-loop中的循环变量
for i=1:1000 i end
for i=1:0.1:1000 i end
附:for-loop中的循环变量
for i=[2 7 11]; i end
i= 2
i= 7
i= 11
附:for-loop中的循环变量
N=[2 7 11]; for i=N i end
成MEX-函数,将大大提高运行速度 匿名函数,内联函数,以及一些面向对象方法,尽量不要
在执行次数多的循环体内使用
提高仿真程序性能的建议——预分配内存
A = zeros(1000, 1); A = int8(zeros(100, 1)); A = zeros(1000, 1, 'int8');
执行速度测试方法——profiler工具
执行速度测试方法——profiler工具
执行速度测试方法——profiler工具
执行速度测试方法——profiler工具
执行速度测试方法——profiler工具
附:减少内存使用的建议
为变量定义合适的数据类型x=zeros(1,1000,’uint8’); 当使用大的矩阵变量时,预先指定维数并分配好内存,避
相关文档
最新文档