这里没有实际的大型程序,仅对大型程序进行了模拟。
首先写5个几乎相同结构matlab的m函数,每个函数有1000个子函数:
还有类似的m文件:cc.m、dd.m、ee.m。每个m文件有1000个函数,限于篇幅,没有全部给出函数代码,但大家很容易补全代码。
在matlab 2009a中运行以下代码3次:
可以看出,首次运行时进行了编译,耗时1.853170秒,以后直接运行,耗时约0.051328 秒。
================
写5个与matlab相同的Forcal模块:
还有类似的Forcal模块文件:cc.txt、dd.txt、ee.txt。同样,没有给全代码,但大家很容易补全。
在OpenFC中运行以下代码3次:
结果:
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中的运行结果为:
和以前一样,第一次运行进行了编译,耗时较长,其余2次不再编译,故耗时较短。
=================
对Forcal程序做同样的更改,即将函数:
改为:
其实改成以下更好,但为了使代码看起来比较长,还是采用上面的写法。
对aa.txt、bb.txt、cc.txt、dd.txt、ee.txt中所有的类似函数都进行改写。
在OpenFC中的运行以下代码:
结果为:
17502.32453314312
0.281秒
17502.32453314312
0.秒
17502.32453314312
1.5e-002秒
===========
可以看出,随着函数变得复杂,Matlab编译耗时增加较快,本例中,Matlab与Forcal耗时之比大约为31:1。
===========
为了比较Matlab与Forcal运行耗时,多次运行以下Matlab代码,时间基本相同:
多次运行以下Forcal代码:
结果:
175023.2453314311
6.3e-002秒
故本例中,Matlab与Forcal运行耗时之比大约为6:1。