数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
[打印本页]
作者:
forcal
时间:
2011-8-2 07:31
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
1、简单循环
* J( U, q; h3 o9 w/ m2 @9 o
) r. \7 D* J8 d5 `0 X7 r0 X
Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:
clear all
1 \9 F$ p7 I3 u2 B% ~
tic
' ?6 ` y& A% }! f
s=0;
3 x# P* j0 P# ~ {$ ?
for k=1:10000
5 s/ q. j- s: p3 Y: {2 g' F' b
for i=1:1000
3 y9 ~ a' R8 u5 P6 g) ?1 S! p
s=s+1;
) q. p/ Q9 w, o$ b- w6 Q
end
7 ]0 }) ]) [9 _4 [
end
6 L# S; u* H' Y- E* i$ R8 W: ~
s
) W+ k" x. T6 A S5 J0 O
toc
' E p7 m" z6 X+ _% R2 F
/ Z& c1 a/ ` z4 V% e8 y
s =
0 t2 U7 k% [+ @( `5 a5 p
- ]6 m+ g; T3 A5 w% n, r+ w/ O
10000000
1 ` m9 L, y7 \1 S* [8 O# ?0 R5 A( K
l s7 v" U" m( _5 h) ^
Elapsed time is 0.092808 seconds.
复制代码
============
* I/ ~& G# m! T: ?4 z& d! q+ G* i
5 ] C" Z0 g0 g$ z/ M
Forcal没有JIT加速器,代码:
!using["sys"];
' T+ a- H r' I* \3 J
mvar:
( H$ F8 Q9 Y0 j& V$ j
t0=clock(),
! q- B& I( k/ f/ R
s=0,
7 ]# j" _/ s8 \. `( D$ Y8 o# B
k=0, while{k<10000,
1 d: J L# n6 E5 }9 i, p
i=0, while{i<1000,s=s+1, i++},
0 S D* ?+ n1 ` U. v6 T0 S
k++
7 K+ F$ C6 R i
},
2 U8 f7 N; z+ ^% b
s;
4 X8 |1 a. _) X5 [& ~1 q' e
[clock()-t0]/1000;
复制代码
结果:
) `" P! \/ r) B
10000000.
" W1 v8 \4 r! ?8 L$ P
0.704 秒
/ {" [8 Q7 u4 p& |+ v$ z g
; T6 }: }- W1 G! c
二者运行效率相差7倍多。
, v+ X0 P7 K" Y4 D
" |' c0 n. ~6 H9 [( [( O2 H
2、循环中稍微加点东西
5 s2 p4 z: b/ J
6 W, l4 D5 R$ L4 `+ w0 @4 R3 N
Matlab代码:
clear all
6 v( r, K6 J) C! C. V. b; k: f
tic
* A, y8 k5 k6 g5 P
s=0;
8 y: M& {, O" f
for k=1:1000
2 q8 h0 u4 l6 m4 K P0 @/ ?
for i=1:1000
6 S1 y) I6 u7 N$ [( D
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);
& t+ c/ }4 I$ o( ?" U
end
" q' E! e8 p1 b4 J6 [( U$ z8 s% u
end
$ v- [: k I1 A/ m' v# N$ l% O
s
" Y4 i! k# t0 h) H4 N
toc
( t8 r* W* _& |+ ]$ Y
' n3 Z6 t5 r2 m' r' A* d1 C
s =
. O: ]- b5 g1 o4 m- k5 L
$ z J8 O F7 o
1.1009e+007
+ s- T, Y7 @# Z8 l W% _
+ p. W: Z4 r* b4 F7 q; R
Elapsed time is 0.727535 seconds.
复制代码
Forcal代码:
!using["sys"];
% |) @ \+ i1 P. i% S) }$ q
mvar:
' i' g3 s' f1 M4 |
t0=clock(),
" O4 x$ ^1 W, x5 o" m$ T& E4 R
s=0,
. V. V S4 @9 w# X: G$ E6 ^
k=1, while{k<=1000,
1 m0 U, ^% t, t' {
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++},
7 A1 ?, f0 `" W3 |2 \
k++
& B: S( D `% x
},
, Q3 D5 t: ~ h0 |8 ~
s;
/ S' ?5 O# x2 H6 g; i0 ]8 ^
[clock()-t0]/1000;
复制代码
结果:
6 g8 _ Y" W* P" |$ v0 `# P
11008953.66602346
$ D" S" d! T" y9 P# G
1.031
. s$ M; q9 A# ~$ G0 E8 w0 j
# B3 g* V1 G9 w% n" L
二者效率相差已比较小。
2 ~) T( K& m5 g+ _
& c, H; a% ^# m r1 X* E: }
3、再增加一个函数调用
' `/ E! m9 R' a8 X! ` ?
' I& @" F$ ~2 z8 t* q3 |4 C
Matlab代码:
clear all
& y( j- g; s c1 O+ @8 ?
f=@(x)x+1;
! r* g5 s& G3 `8 z/ D; R4 \
tic
* v. t, X; |7 Y7 u
s=0;
* k, \( p" A7 T% K
for k=1:1000
7 O& J6 N- N# ?3 R$ V1 K1 }
for i=1:1000
4 [& ~8 u3 h1 U, e1 p
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);
8 S4 S* M/ z8 ?
end
5 m4 l0 I9 e) I+ e0 C) l
end
) j9 q, R$ s0 N' {
s
, K9 ]/ @* ^2 y2 w5 m( X
toc
, M) _) Z! t' I1 ]
, J$ W4 i, j9 j" J; V
s =
; s% N3 u, o- Q! f
[' ~ C3 G' H; f4 p
5.1251e+008
+ v* x) I2 h; G0 \, \) L1 v7 i% O9 v
) _( b) d9 m& r' f* |* c" F9 [, i: V
Elapsed time is 2.173128 seconds.
复制代码
Forcal代码:
!using["sys"];
: O l, u0 Y) C, |
f(x)=x+1;
% S; H' ^1 `, ]9 g& I& R
mvar:
" r( e' J0 y" E3 k
t0=clock(),
( H, G6 B' [' {! t, L# ~2 W
s=0,
+ K* }2 |8 G, C& y: }% K
k=1, while{k<=1000,
! K3 @( a* Z5 Q
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++},
& x' y) A/ j, V# H% Y; J" N
k++
, K( h: b/ y5 }# a
},
4 R8 r6 L/ u' E$ N4 Q5 N
s;
2 U' q+ Z( ~% H) J0 u' q4 A4 l
[clock()-t0]/1000;
复制代码
结果:
, o* H( w9 Z' T& S# Q6 T0 p
512508953.6658993
# X" S$ i% V3 \& H) a+ o
1.078
5 z+ L3 w9 R" K; z$ s/ M6 r
1 d3 @8 E" H7 s. z
可以看出,Matlab效率已不及Forcal。
4 A8 s8 T4 v* Z2 {2 Z+ P. a- b( a9 c
故JIT加速器虽好,但效果似乎并不明显。
作者:
海水
时间:
2011-8-2 08:12
作者:
forcal
时间:
2011-8-2 08:45
4、在JIT加速器下,Matlab的数组存取效率非常高
2 L0 O* v2 I# `2 m* R5 e
4 [+ v6 p2 O# P! B0 S
Matlab代码:
>> clear all
( K0 K# t0 f; ?& r% Q. x
a = linspace(1,1,1000);
# B* f2 P2 E5 ^; X
tic
/ O" r# H# {9 C, v; U3 |& v+ h N
for k=1:10000
( M5 \! L& q+ s5 a' V' X6 _
for i=1:1000
" V" j2 M3 J( {
a(i)=2;
2 q" D4 A& A3 D7 x3 K! ~' c) U
end
4 y1 u- Q, g' D W
end
0 J( W- I0 ~, b
toc
8 S8 o- @/ T( {3 `$ d; S
- |6 g, h6 P" n- x, e! O
tic
( f) W# L8 B4 ]+ P: {$ o' h: q4 d
s=0;
' K2 `) H1 y. _% \+ F. L3 T
for k=1:10000
N& i# h% {3 p) `5 ]; R
for i=1:1000
7 E. m7 o0 c+ ?$ R, L: H2 E9 n$ J2 D
s=s+a(i);
0 B4 @- @2 P8 E$ A. d- F. Q
end
1 m* C$ ~! S7 M. u8 t% a: _3 }& ~
end
9 b1 u3 u3 X$ b& P0 f; ~
s
9 k, r) c* ~5 x6 t
toc
( J7 t9 L" Y0 B: r* u9 E( }+ E- \
Elapsed time is 0.140658 seconds.
# S# d V5 c2 _( T5 M
+ o$ p! k9 U; W- c
s =
" }) [3 ~' N6 f! B$ E
+ a3 i2 n, a. V, f) Z: M
20000000
7 v ?5 d' i7 c0 s6 {' m; i
- M y! ~/ \6 G: R l( b$ X
Elapsed time is 0.091794 seconds.
复制代码
============
$ a# D# @- i* }' m; a" y+ }
, ~3 |- J X) [0 L9 B! W
Forcal代码:
!using["math","sys"];
8 X- c( T& H, j5 [. O. p. _/ e
mvar:
; e. Y k" K" f) `6 o) V# o+ _* x
main0(::a)=
/ X U6 b% w# f9 d, t6 d
a = linspace(1,1,1000),
2 ?! n5 ]) a* d# @# b7 G
t0=clock(),
3 \4 x/ x+ G- d: W0 F
k=0, while{k<10000,
4 B. U5 v" T9 h+ C
i=0, while{i<1000, a(i)=2, i++},
% w9 q1 r# f6 X9 R
k++
" _8 u3 B! z% o2 ~) ]+ d$ N
},
( A( q4 m; y- [ i- V- u: r
[clock()-t0]/1000;
! c* B. b, p* G) U u
7 K% R F8 H5 ~% {9 B; e9 [0 u* e
main1(::a)=
$ d" T6 O4 J4 K ?( y5 I9 h1 ]; E
t0=clock(), s=0,
1 Z0 ^* \ ^' r. ?* @1 `& P
k=0, while{k<10000,
8 F, m! x% d, H% ^4 z9 i S% @3 K
i=0, while{i<1000, s=s+a(i), i++},
/ O' n+ j- t9 ^1 C+ o# B
k++
! N# |0 I: F E8 c; ^
},
. p# O1 Y& P0 Y/ f
s;
8 W# [1 U6 ], w- K& X* t) {6 |( H
[clock()-t0]/1000;
复制代码
结果:
) h! l9 \1 X2 W7 r& X" K
15.484 //存数据所用时间,秒
' ^5 j- ~( i6 m, j8 ?5 U7 b
20000000.
" g$ l- w4 A3 W
5.531 //取数据所用时间,秒
( |1 H0 C. B* D2 B+ K
0 D1 y& v3 z" N+ y4 u; D! `
----------
1 ?" B0 X+ o5 b) m9 t0 F
6 R! } Z% ~5 O/ k- w+ U
用函数sys::A()存取数组数据效率稍高些:
!using["math","sys"];
0 v6 K! o7 d. e. h; [
mvar:
) `) @9 u! Z8 g3 e8 Z
main0(::a)=
$ `8 e/ V& A4 h" z5 P5 j: m
a = linspace(1,1,1000),
9 P9 F/ e6 W' F, [/ a9 y
t0=clock(),
' O" Z6 a6 U- }9 Z. P5 w3 n" H; W
k=0, while{k<10000,
4 w$ P& Z y1 W( T! Q6 r
i=0, while{i<1000, A(a,i)=2, i++},
( t0 A+ I6 v8 m+ ?" M( X$ M
k++
1 b- A' n5 E0 q$ N8 A
},
# J! k, u/ K6 r
[clock()-t0]/1000;
X5 y& o7 `/ j' H3 q, ?
1 d& F n( U1 P/ ~, n( ?8 P
main1(::a)=
& @# h9 H2 G# P
t0=clock(), s=0,
+ V- ^6 m1 e0 a3 W" x
k=0, while{k<10000,
0 t9 }* \7 k3 ?- l" b& z- O+ N, Z3 b
i=0, while{i<1000, s=s+A(a,i), i++},
: V# o6 s3 X8 Y( Z' a5 ]
k++
E9 u- U/ T# C* ?% K
},
* J( s( l2 ?+ ^7 P9 a+ I
s;
$ Q: T) h; a- L- M! j0 J
[clock()-t0]/1000;
复制代码
结果:
" ]/ }; F' @4 \% U6 v
10.469
2 v$ Y: |. }2 a
20000000.
$ q5 G* V8 n U* B0 u, J
3.781
) x( N' ]$ F3 E0 q
0 q y' v' ?, e5 z; C/ d v9 D- m
-------
5 S1 @+ b4 {9 j# G5 D' b# \
/ t% U) v: _ W
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
) ~ _& y7 Q, a7 N) k% b# _
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
9 c0 d) f( e+ K% L' A* H
# L( S$ ]$ F2 G0 Q. A: k
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
- A& y% w* N3 p8 c( t! O3 Z
! X- W2 I6 @) C0 c
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
# U! f7 o H# s# G
, i/ T( y9 \ x6 I0 a
5、在循环中加点东西
1 A" b" r* y% F; P/ T7 l; @9 ~; N
1 T6 q: w! k! q' S
matlab代码:
>> clear all
; J2 o, R8 ?; H
f=@(x)x+1;
, x( [! S8 l. O, }3 g2 L5 O
a = linspace(2,2,1000);
) a8 R! T i- q
tic
6 v( G6 _# P; y+ f- P: A2 l$ |( M9 c
s=0;
: W1 U5 Z% ~" @1 I
for k=1:1000
2 ?1 e' [* h3 L3 e
for i=1:1000
9 [" U; v) Y! n: r$ i
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));
8 l, Q9 |, \8 L; g
end
0 w) ~8 \, ?* X+ W$ C
end
5 i3 L, h- V+ s$ s0 H1 S! N
s
& I2 D5 t/ M! r4 q& z
toc
0 f0 y" }6 x% N" t/ ?; W5 s9 q( [
5 w7 \) r' c" K6 S" {* F! _' A0 G3 p$ A
s =
- f/ q7 {" \% I: Z
0 x) O+ d9 | [; H' u( Y
2.4002e+007
# \% o# U# l, l4 F i/ P
# j8 K# U$ n# ]1 J% i( e
Elapsed time is 2.252997 seconds.
复制代码
Forcal代码:
!using["math","sys"];
* P& [ q. `" t
mvar:
% R5 ?# x. Z8 t1 p2 C3 l
f(x)=x+1;
: ~9 d, g) t- a& y$ Y) x, S
main0(::a)=
" B' c) M; F" ^0 R5 ^% S( U
a = linspace(2,2,1000),
- b2 ^8 C& t5 ]2 \
t0=clock(), s=0,
@+ `# A& @' A! I& J* | o
k=0, while{k<1000,
3 k- v5 D0 {0 K* w0 _' F& K
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++},
; J; b, i! e# r/ O% h1 d9 x' g
k++
: l* \9 \4 s7 g- U/ M) c5 ~
},
$ [5 l; L+ M3 @ y, \9 `
s;
1 _9 w/ _* \4 z1 Y
[clock()-t0]/1000;
复制代码
结果:
9 t4 H- F# T: Z* `# j
24002271.69189384
! B) R$ v, }" B1 b8 f
5.172
( Q3 P% P; V; q8 F
' y( I1 @2 f4 v
二者效率现在只有一倍差距。
+ _/ F4 B* C7 }4 t: P1 q. a
4 g- Q& [% S' ^6 L9 n
----------
9 G& Z; D. w, I# e. i9 k2 m
, f0 S1 f# H" @2 `4 T- K
不过,显然matlab和Forcal的程序应该这样写:
7 i7 A: d. Z# f5 M4 C
, H$ i3 U/ j, B% Z
matlab程序:
clear all
& R. R# M. J6 S& o' j
f=@(x)x+1;
: Y; C5 P4 R, u' w. K9 X/ y+ m
a = linspace(2,2,1000);
8 @2 F' z- ?" H" @
tic
0 P4 Y$ C; q) ]* w8 T% U4 ]! U: `
s=0;
5 l6 ?# |! \+ R+ k9 H+ J
for k=1:1000
2 @+ `0 o$ o3 m# a% H: ]: U5 f; V+ g# C
for i=1:1000
8 M% j+ Z. j- f4 H" J, I& K3 X" V
t=a(i);
; W( B1 J, E4 U7 i) i: w
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);
9 J" X# Z- }# ^. R9 C
end
$ P6 L2 @; }5 F6 R. K
end
! U+ ~: |$ ?* c$ L
s
' J+ p5 [1 W( Y) o7 x! r: n1 n' {
toc
7 l/ q/ h6 r8 N: u! S$ ~1 \
6 Z) F' a$ l8 q# z. m% j6 I+ k/ n
s =
: i& Y# R* p. J9 j2 {2 Z# T# Y
) m# u" u+ k& ]5 Y' R* E* z, c
2.4002e+007
5 b7 ^3 i1 P7 {+ f7 C7 e' b
% f4 Z4 T! c1 ]4 u
Elapsed time is 2.043909 seconds.
复制代码
Forcal程序:
!using["math","sys"];
. t) Y; y4 V+ s& N- X" T& J- b" c
mvar:
, }+ t0 j: |$ l
f(x)=x+1;
8 T6 l: `* [4 r
main0(::a)=
- w/ e( O% e7 }0 K1 c7 b
a = linspace(2,2,1000),
p, o& q& g4 d6 ]7 t' U* `7 r/ h
t0=clock(), s=0,
8 D2 q8 e: g8 M9 [! ^/ w
k=0, while{k<1000,
5 }) _( C& C5 h
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++},
$ D R3 \! v: `- G7 }; l
k++
) `; B1 ?% E+ g9 F& H
},
3 P+ Z( f0 ^: U4 @. ?: {
s;
" n7 K. H) X8 o1 d
[clock()-t0]/1000;
复制代码
结果:
) _8 [. ]3 G# L# B" q, u
24002271.69189384
- Q+ \) a; W5 X# [1 q) A
1.625
8 C% D) x% k0 S& i( J# F
& }# B" r& Q- c3 [& y1 w) A2 N
matlab效率已不及Forcal。
/ G; m/ k# N! T8 y
5 s# ~# W2 G0 h0 e9 q
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。
作者:
forcal
时间:
2011-8-2 09:27
在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。
" v% S9 R; w, Z4 w
7 m- V9 R: u3 U( r; y
Forcal代码:
!using["sys"];
: t; H' h) g3 o( O
mvar:
& d+ I9 ]4 a* |1 U" q+ f. @
a="\&\[1000]"/4, //用字符串模拟静态数组
- l3 j( o6 p% }7 @7 _
t0=clock(),
& C; m% l! \0 C! _
k=0, while{k<10000,
B5 d, | P2 G1 j9 y: k
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
2 u/ N% Z: I' E- i" [
k++
1 |1 z& G4 }7 p% Y: X% [. u
},
9 C6 n! V$ }; [$ ]# \; F
[clock()-t0]/1000;
, F" Y8 }! M& l3 }9 t
; H" y% [ X* d
a="\&\[1000]"/4, //用字符串模拟静态数组
! {$ `/ N5 J- t! f& s2 V* } e
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
& j; p, e" Z ^1 h$ [/ K
t0=clock(),
3 P. L& A% B( R3 t+ y
s=0,
+ `# ]; u4 I" I3 b
k=0, while{k<10000,
* @ Q+ h1 W! R- ^# r
i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值
9 e! Z/ w9 p6 a' @* g
k++
; z c' X- j0 A: p. {; C" a- X# j
},
" E2 Z9 O6 U" t. u
s;
/ g9 k4 i- t+ t8 H# q# U
[clock()-t0]/1000;
复制代码
结果:
! {0 {& i8 H# K4 I
0.5620000000000001 //赋值用时间,秒
4 M9 k, a* S M
20000000.
0 E6 x, v# N1 b6 \$ z- ?
0.579 //取值用时间,秒
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5