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 //取值用时间,秒