极限测试之Matlab与Forcal有无JIT加速器的比较

1、简单循环

Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:

clear all tic s=0; for k=1:10000 for i=1:1000 s=s+1; end end s toc s = 10000000 Elapsed time is 0.092808 seconds.


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

Forcal没有JIT加速器,代码:

!using["sys"]; mvar: t0=clock(), s=0, k=0, while{k<10000, i=0, while{i<1000,s=s+1, i++}, k++ }, s; [clock()-t0]/1000;


结果:
10000000.
0.704秒

二者运行效率相差7倍多。

2、循环中稍微加点东西

Matlab代码:

clear all tic s=0; for k=1:1000 for i=1:1000 s=s+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i); end end s toc s = 1.1009e+007 Elapsed time is 0.727535 seconds.


Forcal代码:

!using["sys"]; mvar: t0=clock(), s=0, k=1, while{k<=1000, i=1, while{i<=1000, s=s+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i), i++}, k++ }, s; [clock()-t0]/1000;


结果:
11008953.66602346
1.031

二者效率相差已比较小。

3、再增加一个函数调用

Matlab代码:

clear all f=@(x)x+1; tic s=0; for k=1:1000 for i=1:1000 s=s+f(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i); end end s toc s = 5.1251e+008 Elapsed time is 2.173128 seconds.


Forcal代码:

!using["sys"]; f(x)=x+1; mvar: t0=clock(), s=0, k=1, while{k<=1000, i=1, while{i<=1000, s=s+f(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i)+1+sin(i), i++}, k++ }, s; [clock()-t0]/1000;


结果:
512508953.6658993
1.078

可以看出,Matlab效率已不及Forcal。
故JIT加速器虽好,但效果似乎并不明显。

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

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

4、在JIT加速器下,Matlab的数组存取效率非常高

Matlab代码:

>> clear all a = linspace(1,1,1000); tic for k=1:10000 for i=1:1000 a(i)=2; end end toc tic s=0; for k=1:10000 for i=1:1000 s=s+a(i); end end s toc Elapsed time is 0.140658 seconds. s = 20000000 Elapsed time is 0.091794 seconds.


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

Forcal代码:

!using["math","sys"]; mvar: main0(::a)= a = linspace(1,1,1000), t0=clock(), k=0, while{k<10000, i=0, while{i<1000, a(i)=2, i++}, k++ }, [clock()-t0]/1000; main1(::a)= t0=clock(), s=0, k=0, while{k<10000, i=0, while{i<1000, s=s+a(i), i++}, k++ }, s; [clock()-t0]/1000;


结果:
15.484//存数据所用时间,秒
20000000.
5.531 //取数据所用时间,秒

----------

用函数sys::A()存取数组数据效率稍高些:

!using["math","sys"]; mvar: main0(::a)= a = linspace(1,1,1000), t0=clock(), k=0, while{k<10000, i=0, while{i<1000, A(a,i)=2, i++}, k++ }, [clock()-t0]/1000; main1(::a)= t0=clock(), s=0, k=0, while{k<10000, i=0, while{i<1000, s=s+A(a,i), i++}, k++ }, s; [clock()-t0]/1000;


结果:
10.469
20000000.
3.781

-------

在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
在使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。

matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。

Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。

5、在循环中加点东西

matlab代码:

>> clear all f=@(x)x+1; a = linspace(2,2,1000); tic s=0; for k=1:1000 for i=1:1000 s=s+f(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i))+1+sin(a(i)); end end s toc s = 2.4002e+007 Elapsed time is 2.252997 seconds.


Forcal代码:

!using["math","sys"]; mvar: f(x)=x+1; main0(::a)= a = linspace(2,2,1000), t0=clock(), s=0, k=0, while{k<1000, i=0, while{i<1000, s=s+f(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i))+1+sin(A(a,i)), i++}, k++ }, s; [clock()-t0]/1000;


结果:
24002271.69189384
5.172

二者效率现在只有一倍差距。

----------

不过,显然matlab和Forcal的程序应该这样写:

matlab程序:

clear all f=@(x)x+1; a = linspace(2,2,1000); tic s=0; for k=1:1000 for i=1:1000 t=a(i); s=s+f(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t); end end s toc s = 2.4002e+007 Elapsed time is 2.043909 seconds.


Forcal程序:

!using["math","sys"]; mvar: f(x)=x+1; main0(::a)= a = linspace(2,2,1000), t0=clock(), s=0, k=0, while{k<1000, i=0, while{i<1000, t=a(i), s=s+f(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t)+1+sin(t), i++}, k++ }, s; [clock()-t0]/1000;


结果:
24002271.69189384
1.625

matlab效率已不及Forcal。

提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。

=========

=========

在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。

Forcal代码:

!using["sys"]; mvar: a="\&\[1000]"/4, //用字符串模拟静态数组 t0=clock(), k=0, while{k<10000, i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值 k++ }, [clock()-t0]/1000; a="\&\[1000]"/4, //用字符串模拟静态数组 i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值 t0=clock(), s=0, k=0, while{k<10000, i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值 k++ }, s; [clock()-t0]/1000;


结果:
0.5620000000000001//赋值用时间,秒
20000000.
0.579 //取值用时间,秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值