极限测试之Matlab与Forcal编译运行大型程序的效率
这里没有实际的大型程序,仅对大型程序进行了模拟。首先写5个几乎相同结构的m函数:%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
在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);
/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);
/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);
/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;
/1000;结果:
175023.2453314311
6.3e-002 秒
故本例中,Matlab与Forcal运行耗时之比大约为6:1。
本例源代码下载: 好啊谢谢啊 我去。。。。。这个还是和电脑性能有关的吧 justftdsky 发表于 2011-8-1 09:51 static/image/common/back.gif
我去。。。。。这个还是和电脑性能有关的吧
应该和电脑性能有关。
我是在同一台电脑上进行测试的,但结果也仅限于此电脑的此种配置。
若有不同电脑或matlab不同版本的测试结果,可在这里贴出,以便于比较。 好东西哦,大家不要光看不顶
页:
[1]