极限测试之Matlab与Forcal编译运行大型程序的效率

这里没有实际的大型程序,仅对大型程序进行了模拟。

首先写5个几乎相同结构matlab的m函数,每个函数有1000个子函数:

%file aa.m function c=aa(x,y) c= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y)... +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y)... ... ... +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); end function c=a000(x,y) c=x+y; end function c=a001(x,y) c=x+y; end ... ... function c=a999(x,y) c=x+y; end


%file bb.m function c=bb(x,y) c= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y)... +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y)... ... ... +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); end function c=a000(x,y) c=x+y; end function c=a001(x,y) c=x+y; end ... ... function c=a999(x,y) c=x+y; end


还有类似的m文件:cc.m、dd.m、ee.m。每个m文件有1000个函数,限于篇幅,没有全部给出函数代码,但大家很容易补全代码。

在matlab 2009a中运行以下代码3次:

>> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 10000 Elapsed time is 1.853170 seconds. >> >> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 10000 Elapsed time is 0.051328 seconds. >> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 10000 Elapsed time is 0.058188 seconds.


可以看出,首次运行时进行了编译,耗时1.853170秒,以后直接运行,耗时约0.051328 秒。

================

写5个与matlab相同的Forcal模块:

//aa.txt a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~aa(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) ... ... +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y);


//bb.txt a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~bb(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) ... ... +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y);


还有类似的Forcal模块文件:cc.txt、dd.txt、ee.txt。同样,没有给全代码,但大家很容易补全。

在OpenFC中运行以下代码3次:

mvar: !t=sys::clock(); #USE# D:\Forcal\Forcal32W\matlab\aa.txt; #USE# D:\Forcal\Forcal32W\matlab\bb.txt; #USE# D:\Forcal\Forcal32W\matlab\cc.txt; #USE# D:\Forcal\Forcal32W\matlab\dd.txt; #USE# D:\Forcal\Forcal32W\matlab\ee.txt; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1); [sys::clock()-t]/1000;

结果:
10000.
0.141秒
10000.
0.秒
10000.
0.秒

可以看出,Forcal首次运行时进行了编译,耗时0.141秒,以后直接运行,耗时约0秒(耗时少,测不出)。

===========

本例模拟测试Forcal编译运行效率大致是matlab 的10倍多。

===========

===========

实际上,Forcal的以上5个模块可以放在一个模块文件中,或者直接写在OpenFC的代码窗口:

mvar: !t0=sys::clock(); //用t0记住此时的时间。该表达式编译后立即执行。 #MODULE# a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~aa(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); #END# #MODULE# a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~bb(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); #END# #MODULE# a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~cc(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); #END# #MODULE# a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~dd(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); #END# #MODULE# a000(x,y)=x+y; a001(x,y)=x+y; a002(x,y)=x+y; ... ... a999(x,y)=x+y; ~ee(x,y)= a000(x,y)+a001(x,y)+a002(x,y)+a003(x,y)+a004(x,y)+a005(x,y)+a006(x,y)+a007(x,y)+a008(x,y)+a009(x,y) +a010(x,y)+a011(x,y)+a012(x,y)+a013(x,y)+a014(x,y)+a015(x,y)+a016(x,y)+a017(x,y)+a018(x,y)+a019(x,y) +a990(x,y)+a991(x,y)+a992(x,y)+a993(x,y)+a994(x,y)+a995(x,y)+a996(x,y)+a997(x,y)+a998(x,y)+a999(x,y); #END# mvar: aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1); [sys::clock()-t0]/1000;


结果:
10000.
9.4e-002秒

多次运行的结果相同,每次都是先编译后计算。编译和计算共耗时9.4e-002秒,由于不读文件,故耗时减少了。

每个模块文件可包含许多子模块,每个子模块可输出任意多个全局函数,这是Forcal的优点。模块及函数不必存为磁盘文件也可编译运行,也是Forcal的优点。

==============

==============

为了使测试更符合实际,改写函数:

function c=a000(x,y) c=x+y; end

为下面更一般的形式:

function c=a000(x,y) s=0; if x>y s=x+y; else s=x-y; end for i=0:2 s=s+i; end c=s+x+y-x*(exp(y-x)+sin(x+cos(y))-0.5); end


对aa.m、bb.m、cc.m、dd.m、ee.m中所有的类似函数都进行改写。

在Matlab 2009a中的运行结果为:

>> clear all >> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 1.7502e+004 Elapsed time is 8.762889 seconds. >> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 1.7502e+004 Elapsed time is 0.069484 seconds. >> tic; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1) toc ans = 1.7502e+004 Elapsed time is 0.068631 seconds.

和以前一样,第一次运行进行了编译,耗时较长,其余2次不再编译,故耗时较短。

=================

对Forcal程序做同样的更改,即将函数:

a000(x,y)=x+y;


改为:

a000(x,y:s,i)= s=0, s=which{ x>y, x+y, x-y }, i=0, while{i<=2, s=s+i, ++i }, s+x+y-x*(exp(y-x)+sin(x+cos(y))-0.5);


其实改成以下更好,但为了使代码看起来比较长,还是采用上面的写法。

a000(x,y:s,i)= s=0, s=which{ x>y, x+y, x-y}, i=0, while{i<=2, s=s+i++ }, s+x+y-x*(exp(y-x)+sin(x+cos(y))-0.5);

对aa.txt、bb.txt、cc.txt、dd.txt、ee.txt中所有的类似函数都进行改写。

在OpenFC中的运行以下代码:

mvar: !t=sys::clock(); #USE# D:\Forcal\Forcal32W\matlab\aa.txt; #USE# D:\Forcal\Forcal32W\matlab\bb.txt; #USE# D:\Forcal\Forcal32W\matlab\cc.txt; #USE# D:\Forcal\Forcal32W\matlab\dd.txt; #USE# D:\Forcal\Forcal32W\matlab\ee.txt; aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1); [sys::clock()-t]/1000;


结果为:
17502.32453314312
0.281秒
17502.32453314312
0.秒
17502.32453314312
1.5e-002秒

===========

可以看出,随着函数变得复杂,Matlab编译耗时增加较快,本例中,Matlab与Forcal耗时之比大约为31:1。

===========

为了比较Matlab与Forcal运行耗时,多次运行以下Matlab代码,时间基本相同:

>> tic; s=0; for i=1:10 s=s+aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1); end s toc s = 1.7502e+005 Elapsed time is 0.426280 seconds.


多次运行以下Forcal代码:

mvar: !t=sys::clock(); #USE# D:\Forcal\Forcal32W\matlab\aa.txt; #USE# D:\Forcal\Forcal32W\matlab\bb.txt; #USE# D:\Forcal\Forcal32W\matlab\cc.txt; #USE# D:\Forcal\Forcal32W\matlab\dd.txt; #USE# D:\Forcal\Forcal32W\matlab\ee.txt; i=0, s=0, while{i<10, s=s+aa(1,1)+bb(1,1)+cc(1,1)+dd(1,1)+ee(1,1), i++}, s; [sys::clock()-t]/1000;


结果:
175023.2453314311
6.3e-002秒

故本例中,Matlab与Forcal运行耗时之比大约为6:1。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值