数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
[打印本页]
作者:
forcal
时间:
2011-8-2 07:31
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
1、简单循环
$ v% ~4 S, B4 ], P1 k3 M7 G! a' B# Z
/ D3 r0 }5 C( M$ l
Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:
clear all
8 r! ?+ R0 c. ^* M% v7 z/ B0 I
tic
& J: l$ ?# t$ z& M' n& n
s=0;
6 J+ l- x e% [$ ^% l% l; K: B
for k=1:10000
4 i1 e, Y0 o9 Q% m' @% X
for i=1:1000
. |, S# _$ b. }( Z4 y0 Z! ]" {$ k0 ?
s=s+1;
! |: j+ \3 L( W; a, X
end
% z7 U) g* r/ d! R) u; s) V
end
! H6 `# m7 Z) M: [% q, g1 P/ d
s
3 k6 Y+ g' ~$ n& p$ e
toc
- i7 d% z# e- y/ T- R
e) M# s7 R9 Y( X- t
s =
% \( \& g4 v" V0 I; K
$ J) b, h, H2 L% b1 D ` f& A: m
10000000
2 ^- D6 P, B; ~5 J; Z
) f1 V- g. G O
Elapsed time is 0.092808 seconds.
复制代码
============
5 K6 d& O" U1 u: F: f, o% S% d
9 A! k5 E" R, @- w! a3 E
Forcal没有JIT加速器,代码:
!using["sys"];
* F9 \+ i( L5 s- a. K; O
mvar:
0 ?# b2 \: I6 }% U, O
t0=clock(),
5 v4 a: `5 l3 _# F+ f v
s=0,
/ w& Y+ J- |3 W. P" D4 H" t
k=0, while{k<10000,
' ~" m( l! E! T5 u2 z! A/ T
i=0, while{i<1000,s=s+1, i++},
t+ n" l$ ]+ R; S$ q8 x# F
k++
: q6 h- W( h, G
},
, y0 U( a$ a8 b1 `1 K9 p* ?- O( ?
s;
# N' r# f1 i2 H4 f
[clock()-t0]/1000;
复制代码
结果:
% z/ B. ?5 z4 S ?
10000000.
% V, P& v4 L: `# U6 |
0.704 秒
. Z+ u& r1 P- o) y
' }5 z$ s+ h* Y) i% Z& l
二者运行效率相差7倍多。
7 H$ Z: a$ ?- ?7 g9 w9 M* ~
& n& t* @; Y0 q4 U" L, T
2、循环中稍微加点东西
+ y+ Y3 S6 [7 T- Y" T
7 c% |; k9 o+ @4 c# w. Y
Matlab代码:
clear all
6 d* s* Y) f* P- r3 I
tic
& q; L( A4 V4 y9 D m
s=0;
: T4 V1 y5 n, d3 T3 G( t
for k=1:1000
: X! w7 z. l+ e0 M( W0 f) f
for i=1:1000
& r* w& }8 P" n0 e/ k
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);
0 X3 Z q$ \! {0 _. P
end
i/ i' o* u$ U
end
/ c& _) M+ X* V, [
s
7 S/ q, @/ \4 E
toc
6 u& b/ w, l4 U' L
1 Z' a( a" C1 n" Q4 ]/ @
s =
* q+ b3 {" M4 u: ]4 k7 Y8 F9 B
# V, D1 ~9 J' R* X& T$ N9 ]
1.1009e+007
0 @+ Z+ ^* R6 `" U7 ~
4 b' i- W( T3 p2 x
Elapsed time is 0.727535 seconds.
复制代码
Forcal代码:
!using["sys"];
3 g5 x8 |; T% I! U4 u6 O
mvar:
: \/ A p7 n' @
t0=clock(),
s. J _% a0 j8 P# m" x/ G
s=0,
$ B) f! X7 Z/ a+ l9 e
k=1, while{k<=1000,
% L9 G+ _1 \0 t7 P
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++},
5 L5 T1 n# Y2 l* X& K8 ?" V7 T: s0 c
k++
1 W$ \* }$ L: H8 {! S2 y
},
6 z. M$ V" e! Q/ H4 T! Z; [
s;
7 b/ S4 @# |* j, X6 `6 j4 N. M
[clock()-t0]/1000;
复制代码
结果:
% r& E; ?1 `. X' u/ ^( D+ _0 R
11008953.66602346
* p2 S6 h1 W& M2 C s
1.031
) s0 M% j. \" v- K+ P6 V$ O" P
4 W! H1 w4 J8 Y
二者效率相差已比较小。
% p9 ]4 U: @8 L1 [7 b
: s3 d) B5 x# e4 Q" I& V; h: y
3、再增加一个函数调用
/ T% R/ X1 E2 O
; z; P7 P5 _. o. }. g
Matlab代码:
clear all
$ R! V. A7 T9 s+ S0 Z0 I1 h
f=@(x)x+1;
* ^2 P* Y: A: [
tic
' y' q1 K! G- e, w( D7 r* B
s=0;
! q" v( M* O# ~6 L
for k=1:1000
1 l9 A) `7 h" F" q
for i=1:1000
4 k# O( X8 p8 z; K: F- }
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);
0 \" ^( _& ^1 e& E1 E2 \# E' F
end
' b: ^ B2 Z r* G( V: c
end
1 p$ B1 f8 g4 l; m, ?
s
7 G4 h2 g7 y& z" {# f9 \
toc
8 i# P$ L' [" a$ K% X: R* w# Y
3 B s( F0 K' W
s =
1 K- C3 x* V, y5 \/ a
! W1 o: ]: r, [5 G6 y6 B
5.1251e+008
& C7 t8 w! l; k7 }
/ ~# m3 _ j3 U# t2 @
Elapsed time is 2.173128 seconds.
复制代码
Forcal代码:
!using["sys"];
1 |: |' I1 [7 [0 \
f(x)=x+1;
, m4 P4 f5 k% l, n
mvar:
: |" z' M6 _% L: s1 ~8 ?
t0=clock(),
}- i; E8 W, x( k; S: q
s=0,
S$ h& `$ c9 _, a1 v
k=1, while{k<=1000,
$ k7 n9 @4 t) c5 g
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++},
) U5 ]. `, o" A+ {! C7 b
k++
8 K( k# X: ?+ N$ {% _- K L
},
7 c8 k ]1 ]: K1 i) e8 g! j2 T
s;
0 L2 l) L1 o- ?& u1 Q
[clock()-t0]/1000;
复制代码
结果:
( t1 z% y, d3 X3 n- c* Z. v$ T [
512508953.6658993
' D1 u) H6 b# ]/ c2 y3 s
1.078
) ]6 Y9 Y5 ~7 C( Z8 F Y3 F0 M
$ J) s' s. J4 ^' T" ~, I8 B" X
可以看出,Matlab效率已不及Forcal。
2 E0 T; A5 w; S# V: O! E8 ~+ u
故JIT加速器虽好,但效果似乎并不明显。
作者:
海水
时间:
2011-8-2 08:12
作者:
forcal
时间:
2011-8-2 08:45
4、在JIT加速器下,Matlab的数组存取效率非常高
- o4 n, `3 r% @1 j4 T
7 y' G& w, q- I1 D# b
Matlab代码:
>> clear all
7 [* [ s3 q3 G1 C. r# C
a = linspace(1,1,1000);
$ w: x; \/ w( D+ f4 B& v. h1 s
tic
) r; h; ]/ [! A% l- P3 i+ h
for k=1:10000
: a+ j; ~6 ^* [- W: E8 T1 T
for i=1:1000
1 J& i8 D C! t; Z; o
a(i)=2;
3 N! g1 v5 Z0 |# `- B! t+ C
end
5 s# v; ?7 _0 |2 q3 [
end
! d4 T. r, c p( e$ C5 Y
toc
8 V4 y: ~$ j! h$ _+ b
) j- I2 f; [$ K/ S0 u
tic
1 j7 F8 X% j" u" i
s=0;
) R# ^3 n* I2 `5 J
for k=1:10000
8 T* T+ {" y* k' T! O' E
for i=1:1000
! [+ i& A) \% ^8 G7 P6 W/ I
s=s+a(i);
T5 U4 N r2 e5 \- {; I! s0 {
end
* w- }. X; J- \! o8 k5 M; t' j+ ^8 U
end
$ C( n; \1 M% N4 ~; |0 ^
s
) F+ r) k2 [: G$ }6 | P- g
toc
" B$ ]; ]0 S$ b4 J) ]% w! I
Elapsed time is 0.140658 seconds.
$ Y' a+ M* r9 c! j5 o
; J7 s4 O. p1 D1 ^) ]
s =
+ ~7 e, t/ J, _; V$ E2 K) F
* q8 ^& H7 n1 G& J& C3 J
20000000
q; ]5 p+ J5 y
( X: g9 u8 W8 y8 s' g
Elapsed time is 0.091794 seconds.
复制代码
============
% g: R, A' q. F. ^
4 ^6 @2 U$ Y3 l/ X( h2 _
Forcal代码:
!using["math","sys"];
+ R2 o4 w; Z, @ F% G
mvar:
* }; T8 W$ w+ y4 z6 h/ @
main0(::a)=
; E# u7 C$ [4 ^8 o! y7 w
a = linspace(1,1,1000),
9 C5 u; g2 E. I
t0=clock(),
, D2 O- }5 c! e$ i i
k=0, while{k<10000,
8 C$ V# q0 V, Q1 h
i=0, while{i<1000, a(i)=2, i++},
/ K4 S6 u }- W( t( g8 \& T. G* J
k++
6 ?! h+ J2 p a2 J
},
* G9 q' f- ~0 D$ J: w
[clock()-t0]/1000;
1 L, p, S6 U, \; p
* i% W3 V0 D" h' Y- m9 f; D
main1(::a)=
# n* k+ ]; F; v. v; B
t0=clock(), s=0,
- |0 a1 |; H' u) T# d6 B4 E
k=0, while{k<10000,
4 n( D, ~3 L. p; V* H0 y) r0 E
i=0, while{i<1000, s=s+a(i), i++},
7 \2 i& X r8 Y! @9 g$ ^3 ~( e4 T
k++
3 z" {5 F7 }( r- H- Q, D# N
},
0 ?( z; k, @' T, i* S
s;
0 e0 J1 U, U4 @, Q0 e
[clock()-t0]/1000;
复制代码
结果:
8 e. Q. N7 w$ h
15.484 //存数据所用时间,秒
- F" ]' A5 b6 N- ~' S
20000000.
3 O) X8 C) G! G9 v: X. B4 l
5.531 //取数据所用时间,秒
/ F' z5 ^3 C% i/ u3 |
0 b9 A: i, U, G0 L; v' P3 y
----------
e7 |$ b( r. M. ^ } i% L
8 |3 g: P( {7 m N3 d
用函数sys::A()存取数组数据效率稍高些:
!using["math","sys"];
, l$ d) \5 T. L& C; T' I
mvar:
/ S; B/ T: Z P$ [( U: m$ v
main0(::a)=
/ ]4 A+ o! T! u! e
a = linspace(1,1,1000),
0 o0 J* w% k5 _
t0=clock(),
& }2 j! P2 l( z6 u$ A4 ]
k=0, while{k<10000,
2 ^" h9 C" p- d$ Q) N3 N
i=0, while{i<1000, A(a,i)=2, i++},
! B$ K, m7 D/ F% ?+ b$ D8 @
k++
8 Q( c: ~ B+ g# S; {: e( T
},
; ]5 p* O$ y6 s( E* T# g4 b
[clock()-t0]/1000;
- M/ P+ ?0 l! T$ p# n
2 D/ B5 s# q! ]* o/ w- G
main1(::a)=
5 r7 T% u% f8 K$ H' f! k% N) z1 S
t0=clock(), s=0,
4 o, `% ]1 } C" M) _
k=0, while{k<10000,
0 e" ~- z4 t. n
i=0, while{i<1000, s=s+A(a,i), i++},
5 ]* v& y$ [- X$ B+ Q2 H0 F
k++
5 k s) F9 p Z! `
},
6 n B5 n2 ^! O( g
s;
! \6 H7 I8 y3 n
[clock()-t0]/1000;
复制代码
结果:
- X; u7 W; P9 e# I% w" b
10.469
) l% K2 I" R1 |0 k
20000000.
t) L- s- v5 I
3.781
+ s4 E8 w6 q3 e9 }4 P% D
7 c8 a9 c5 ]0 }( ~
-------
- S0 W$ j- o3 [, U% p6 l
5 E. }* d, O$ F4 h5 e+ Y. _: A
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
! W9 x4 x3 N; f! i
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
! Y; S: R0 F% a* ~/ a
`4 G% L2 p' v* F8 Y+ C9 b
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
* D% D9 j# J& M- M2 C$ n1 ]8 V
" ~8 ]" ~# K* ]5 I
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
: L7 C! i4 ^: t) k& X
( m, H8 K4 W- K& o
5、在循环中加点东西
b5 f6 W! w! Z/ Y
' k m( r2 i3 ~. I9 t$ _
matlab代码:
>> clear all
3 B5 ^# Z* e* E8 E
f=@(x)x+1;
6 U, [# j ?; r/ v" u3 e- ~
a = linspace(2,2,1000);
" N' N) B" y6 A5 d) C/ ~9 q
tic
7 g& p! `1 ?/ M& F# I s. k4 ]
s=0;
0 o% y: y( d# n! [' D, }
for k=1:1000
, m* I. ^' t. k% E
for i=1:1000
! X/ D4 g. p8 l4 \+ E4 }% F
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));
6 P! e# a- d1 x# b# W
end
; z0 w' e" B! l) O. b( C" ?+ q
end
0 ~2 z# O2 ]: M' R n) f4 I
s
- q% G4 c3 x5 p
toc
$ O4 E* L5 s# W& R) z9 s8 b
* |* ^3 y5 f1 r6 C
s =
* n0 y7 D) q$ Y0 F5 l: b
, q4 K+ H* c) ]9 R4 o' {) S; h
2.4002e+007
& g+ v, @( V) }+ D2 w, |) l
2 q' l9 T# p$ O
Elapsed time is 2.252997 seconds.
复制代码
Forcal代码:
!using["math","sys"];
- K' C# o0 V% ?* a* g- F6 w
mvar:
- g5 o3 o( M2 @5 A/ c' f, t" w
f(x)=x+1;
3 h, u5 P4 r. j7 \/ U& f/ t1 _
main0(::a)=
+ c) l1 R) o% o' Q0 q% u+ Y. o
a = linspace(2,2,1000),
; `! W9 z9 |! U" E
t0=clock(), s=0,
V/ y. R# X/ J1 c m6 V
k=0, while{k<1000,
f# m9 J4 g+ e3 U
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++},
1 e7 Z" b) s, R: m$ U+ |6 R# k
k++
5 D9 o# ~! |$ {. v6 `
},
1 k6 c: X( Z/ v! c" y
s;
2 I4 F" F T$ E4 B7 O5 K% z
[clock()-t0]/1000;
复制代码
结果:
" {) R0 Q9 t3 c! y9 A
24002271.69189384
, }6 q7 N9 ], S$ U. B
5.172
! ~3 |2 d, a& H& o- C/ c9 F; {
: C. |. c+ P6 r. z
二者效率现在只有一倍差距。
( C" ]& K4 k+ @0 p
3 ~: `- r* B* q4 ?) U8 d1 ^9 g" b6 w' @
----------
& h* w- j+ z% _" }8 f5 f3 d
; y! E7 ~$ }, B, K$ o/ R/ ? D4 M
不过,显然matlab和Forcal的程序应该这样写:
/ E4 X) V- C) u3 R/ ~% m2 `7 S
: ^" d% I. m8 q
matlab程序:
clear all
0 }: f. t2 q4 v% H' d! f; L
f=@(x)x+1;
& Z/ ?, @3 G/ @0 y! F8 B
a = linspace(2,2,1000);
0 c& t2 p* c) H2 `% }% a
tic
( {& o+ G$ I! ?7 S1 `5 O9 Y' G
s=0;
2 x6 W1 }/ R" d( U$ t) ?' D
for k=1:1000
/ a8 ] \7 q) Z7 L, u
for i=1:1000
H. ?" ~ A1 }( H: L9 c
t=a(i);
x7 L8 ~; T6 B7 g3 h2 U
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 ~; L p3 l0 ]" O! T! L9 |! H* |
end
( R: j; C2 S! n4 W4 r1 f1 B
end
0 ?0 a& M B7 v# C2 n
s
0 }8 F8 i) }4 B3 w) W
toc
2 O+ W4 b. h Y' b0 r6 j
3 b" F! K" ]- }7 o# F
s =
& q: j% W8 {8 u
; l) F4 b l/ [0 ?, C6 A
2.4002e+007
{+ M. `- s4 p4 _5 n% b& A
5 ^8 I4 Y. F, {! R
Elapsed time is 2.043909 seconds.
复制代码
Forcal程序:
!using["math","sys"];
4 l, y; }- k& h
mvar:
, `( g2 _) V l
f(x)=x+1;
$ c" W" Z7 ?( {& t. D1 O
main0(::a)=
( Q) F8 b. g% y1 Z" Q, e! X1 i
a = linspace(2,2,1000),
* N6 K. k# w% O) ?7 I4 h1 e
t0=clock(), s=0,
+ K8 E, {8 x& \% P% c
k=0, while{k<1000,
! H5 i& q7 M$ ?( x, H& m
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++},
6 `+ P6 @7 F% C$ h& j
k++
# H ^% _3 `. x X
},
( P. u7 a7 q0 e# u* \
s;
7 c6 \& h: ~$ o2 e, s
[clock()-t0]/1000;
复制代码
结果:
/ j- _: [; y, O! Z7 O6 V3 x; L
24002271.69189384
3 Y& o4 W# j- a: z4 @
1.625
; E: {/ F9 h8 |( B, L" L
( v, R" i% _8 T' N3 d- U
matlab效率已不及Forcal。
+ y( F0 r9 a! I3 f
, O0 i. L V/ b. z4 r. x. q4 L) h7 H
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。
作者:
forcal
时间:
2011-8-2 09:27
在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。
( L7 Q g1 M. L: u: G' n* V- A5 _
' @" C b) H+ H
Forcal代码:
!using["sys"];
! _1 c" Q/ i7 n9 a' z# C
mvar:
' Z p1 ~ |2 j) t
a="\&\[1000]"/4, //用字符串模拟静态数组
% J5 r5 G" |0 e; M0 f& t
t0=clock(),
8 o- V/ w' ^7 n2 V
k=0, while{k<10000,
. O) k) ?) L: W
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
/ s% {7 [! K5 b" }
k++
% e7 f$ S3 D. f( `
},
* ]( D: }$ J& a% {7 X
[clock()-t0]/1000;
7 f4 l. A: `) g6 z
, K9 Y8 d" H% w2 |( m( m0 _
a="\&\[1000]"/4, //用字符串模拟静态数组
# C- i. c) _/ ~1 Z# ]( q% t1 @/ e
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
: G/ ~# Q7 Q6 H U# H
t0=clock(),
: K, A$ V- c9 h- a! B
s=0,
. n0 l$ j. Z, D" k8 U
k=0, while{k<10000,
% R5 d" w7 e/ W- W- n/ d1 F+ v
i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值
$ X, e+ w. z1 q r( G. X
k++
2 j; [4 F& I7 `$ L" F0 g# ]
},
! r6 e2 E* z9 M; x. F4 X. R5 G( a
s;
" ^' `& T' `; e& i
[clock()-t0]/1000;
复制代码
结果:
6 t9 X4 L( Q/ C" l# D
0.5620000000000001 //赋值用时间,秒
4 ?1 Z6 C, f. L; U( P
20000000.
: m- y1 b `" J Q7 G
0.579 //取值用时间,秒
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5