通行证│用户名: 密码: 验证码: 验证码,看不清楚?请点击刷新验证码 电信网通铁通移动   在线
资源搜索:
热门搜索:Linux VB C语言 PhotoShop Flash TCP/IP
   首页 | 文章 | 软件 | 动画 | 资源 | 励志 | 骗术 | 论坛 | 邮箱 | 会员中心 | 军事 | 科技 | 博客 | 图片 | 商城 | 最新更新 | 800g资源 | 爱心黑客
您现在的位置: 爱国者黑客 >> 资源 >> 机械电子 >> MATLAB >> Matlab基础 >> 文章正文

Matlab 编译文件的性能优化
责任编辑:admin   更新日期:2005-8-6

12.5 编译文件的性能优化
12.5.1 优化原M文件的性能

12.5.1.1 提高向量化程度
【例 12.5.1 .1-1 】本例演示: M 文件与 MEX 文件、向量运算与循环运算的速度比较。

(1)编写如下两类函数 M 文件。
function y=sa(x)
x=x+(x==0)*eps;
y=sin(x)./x;
function y=saf(x)
n=length(x);
for k=1:n
x(k)=x(k)+(x(k)==0)*eps;
y(k)=sin(x(k))/x(k);
end

(2)在 MATLAB 指令窗中,对 sa_mex.m 和 saf_mex.m 进行编译。
cd d:\mywork
mcc -x sa_mex %<1>
mcc -x saf_mex %<2>

(3)运行四个文件,记录运算时间
t=-2*pi:pi/500:2*pi;
tic;sa(t);tt(1)=toc;
tic;saf(t);tt(2)=toc;
tic;sa_mex(t);tt(3)=toc;
tic;y=saf_mex(t);tt(4)=toc;

(4)结果显示和比较
plot(t,y,'r-');grid

图 12.5.1 .1-1

disp(' 运算速度比较 ')
disp(' sa.m saf.m sa_mex.dll saf_mex.dll')
disp(tt)

运算速度比较
sa.m saf.m sa_mex.dll saf_mex.dll
0.3300 2.9100 0.3800 2.5800

12.5.1.2 对数组进行预置
【例 12.5.1 .2-1 】以上节例 12.5.1.1-1 为基础。 saf.m 文件中数组变量 x 和 y 的大小随循环进行而增长,这大大减慢了运算速度。本例演示:在循环前对进行变量预置的好处。

(1)编写如下文件,以 saf_pro.m 和 saf_pro_mex.m 为名,将之保存在当前目录下。
function y=saf(x)
n=length(x);
x=zeros(1,n);y=zeros(1,n);
for k=1:n
x(k)=x(k)+(x(k)==0)*eps;
y(k)=sin(x(k))/x(k);
end

(2)产生编译文件
mcc -x saf_mex
mcc -x saf_pro_mex

(3)运行
t=-2*pi:pi/500:2*pi;
tic;saf(t);tt(1)=toc;
tic;saf_pro(t);tt(2)=toc;
tic;saf_mex(t);tt(3)=toc;
tic;y=saf_pro_mex(t);tt(4)=toc;

(4)速度比较
disp(' 运算速度比较 ')
disp(' saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll')
disp(tt)
运算速度比较
saf.m saf_pro.m saf_mex.dll saf_pro_mex.dll
2.8600 0.6600 2.6300 0.4400

12.5.2 利用mcc(-V1.2)的优化性能

12.5.2.1 编译时指定优化选项-r和-i
【例 12.5.2 .1-1 】求如下非线性差分方程组在 10000 个点上的值。观察原 M 文件、无选项和有选项 MEX 文件运行速度的不同。


(1)利用 MATLAB 编辑窗口编写如下 M 函数文件
function [x,y]=m_henon(n)
x=zeros(1,n);y=zeros(1,n);
for k=1:n-1
x(k+1)=1+y(k)-1.4*x(k)^2;
y(k+1)=0.3*x(k);
end

(2)对 M 文件分别选用编译器 2.0 和 1.2 进行编译如下。
cd d:\mywork
mcc -x mex20_henon % 用 2.0 编译器产生普通 MEX 文件 <1>
mcc -V1.2 -ri ri_mex12_henon % 用 1.2 编辑器产生优化的 MEX 文件 <2>

(3)计算各文件运行时间费用的相对值。
n=10000;
t=zeros(3,2);
for k=1:2 % 运行两次,以做比较
tic;m_henon(n);t(1,k)=toc;
tic;mex20_henon(n);t(2,k)=toc;
tic;ri_mex12_henon(n);t(3,k)=toc;
end
t=t/t(1,1);

(4)显示比较结果
filename=[ ' m_henon';
' mex20_henon';
'ri_mex12_henon';];
disp([' 各文件运行开销的相对值比较表 '])
disp(blanks(1)') % 产生一个空行
disp([' 文件名 第一次运行 第二次运行 '])
disp([filename blanks(3)' blanks(3)' num2str(t)])
%blanks 产生两个空列
各文件运行开销的相对值比较表
文件名 第一次运行 第二次运行
m_henon 1 0.78086
mex20_henon 0.69753 0.59259
ri_mex12_henon 0.015432 0

12.5.2.3 利用编译注记优化性能
【例 12.5.2 .3-1 】编译注记 %#ivdep 的应用举例。

(1)编写如下两个函数 M 文件,并存放在 d:\mywork 目录上。
[ivdep0.m]
function A=ivdep0( )
A=1:10;
A(5:9)=A(3:7);

[ivdep.m]
function A=ivdep( )
A=1:10;
%#ivdep
A(5:9)=A(3:7);

(2)分别对这两个文件进行编译 。
cd d:\mywork
mcc -V1.2 ivdep0
mcc -V1.2 ivdep

(3)在 MATLAB 指令窗中运行以下指令。
tic;A0=ivdep0;t0=toc;
tic;A=ivdep;t=toc/t0;

(4)显示结果 。
A0,A
disp([' 使用编译注记 %#ivdep 后的运用时间仅为原来的 ' num2str(t)])
A0 =
1 2 3 4 3 4 5 6 7 10
A =
1 2 3 4 3 4 3 4 3 10

使用编译注记 %#ivdep 后的运用时间仅为原来的 0.15152

 
  • 上一篇文章:
  • 下一篇文章:
  • 热门文章
    Olldbg常见问题
    汇编语言的艺术(组合语言的艺术)--观
    汇编语言的艺术(组合语言的艺术)--准
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言的艺术(组合语言的艺术)--基
    汇编语言---程式设计 (4)
    虚拟8086模式
    SYS命令使用说明
    javascript + CSS 实现动态菜单显
    推荐文章
    自制Windows XP SP2自动安装光盘
    SQLServer注入工具改进版 v1.02
    使用photoshop CS进行自然美肤
    Photoshop绘制诺基亚手机
    PHOTOSHOP制作秋日之梦
    PHOTOSHOP鼠绘名模王爱萍
    Photoshop制作晶莹飞溅的水珠
    教你用PHOTOSHOP做放大镜
    鼠绘美女及服装修画全过程