数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
[打印本页]
作者:
forcal
时间:
2011-8-2 07:31
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
1、简单循环
4 i6 d. w8 W8 T% V( c' x! X
* {6 V j- U' X+ a
Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:
clear all
" O+ ~( V6 k1 z5 G! R8 ?: u! J
tic
7 N4 M% a& f# o" Q
s=0;
9 y, ^8 V+ }) a! Z& Q- ?0 c
for k=1:10000
% E8 A, W6 a% M% o# ^$ b- _) t/ I; U
for i=1:1000
7 J4 V2 e- D- v+ g+ [
s=s+1;
6 }4 `& s2 j H( K" X8 p r
end
V# @# y# p% Y
end
* u9 i) ?% r9 L6 \: e2 W$ q
s
& t7 J2 q1 z- P8 x
toc
& A. a0 A" m# u! h1 d3 m8 d
. }! Y* v, Z8 B m0 c* v
s =
6 w |- }2 ~# c. H7 h+ P% l
& h' w; P; c! }% o* M* |# V/ E
10000000
0 n3 R; o9 ~- V! v P# W# r
5 e. P2 |7 c v
Elapsed time is 0.092808 seconds.
复制代码
============
) O7 k- a2 E2 G9 i( F4 }
4 f# [) A5 M- w, Q; E1 i5 q
Forcal没有JIT加速器,代码:
!using["sys"];
$ `0 J B" C* `# [& V
mvar:
; R+ X+ x* b& u* w9 t) _( X) o
t0=clock(),
, T" D) @/ M& T) m8 c2 Q K
s=0,
5 f: p8 G$ [3 S& N
k=0, while{k<10000,
: B/ b3 \/ N5 T# w2 p# t5 a3 u
i=0, while{i<1000,s=s+1, i++},
) i6 {4 }' t1 N5 {/ @: r% ?
k++
" D/ C4 e$ ]/ w: g; _7 B
},
" L$ G7 @- o! x; x# i
s;
4 Q' o c$ M' \2 L, `9 C6 I9 T
[clock()-t0]/1000;
复制代码
结果:
+ y! [# j! b9 a
10000000.
% P' L" S2 r s# F) r: l& ~
0.704 秒
# u }" J9 b1 m2 }" n c% a8 d
: I+ V, E. G5 b% O) y
二者运行效率相差7倍多。
( K/ ?; M) q3 u$ S5 G
. @5 D& M9 M- V" h. x, K3 o; {8 H
2、循环中稍微加点东西
1 M$ i q# `5 p9 U2 N
d& q! X0 A( B, i: ?
Matlab代码:
clear all
3 N' ~1 r8 k, z% @2 F
tic
" J. q( v; `+ f
s=0;
( p F& `2 p( w( Q/ h
for k=1:1000
! j6 s1 i! z' f4 E1 M
for i=1:1000
1 _3 t$ K# v" y* [' L( I9 Z: S
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);
$ R+ Q: b3 R& Q. M3 s& J7 c
end
8 V' Q. E& {, }! y
end
" c6 B s9 ]) }- V6 [) W) { \6 S% h
s
& s- l, o! v+ s9 s
toc
0 S! J3 w0 c9 i# H% V& ~
" ?3 ~9 K$ @2 P
s =
( g! Z, D8 d% C9 Y" I; v% ~$ X: p
1 S* p4 j( T5 e8 J+ \0 S6 e( X
1.1009e+007
1 J/ u3 \5 ?. d& T" Y. T0 h
/ ^7 w; w! F/ s7 |0 X5 o
Elapsed time is 0.727535 seconds.
复制代码
Forcal代码:
!using["sys"];
$ Q: R* `; H$ c8 i) h* U; n& z
mvar:
" ^/ V2 t$ P0 K/ c7 h S3 N
t0=clock(),
" D# n) |/ x* O( |& r4 W2 t# E
s=0,
: L3 T( l' J: K( D! P; f
k=1, while{k<=1000,
6 J% F: o2 J3 w
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++},
/ U* S, b2 w+ j4 d
k++
& F+ ]8 j) y- x) j
},
7 U, M" ^5 A5 D0 s1 j" { E
s;
3 C/ b O* j' B" i/ Z6 O5 s0 L
[clock()-t0]/1000;
复制代码
结果:
/ z8 F& S, G) K. `* b
11008953.66602346
4 `. z# g' n2 W2 n
1.031
. Q* \% {) I( m, Y" h7 v
( F& d7 N0 }2 D' R! t" ~% @: _
二者效率相差已比较小。
- V& ?' a: b1 O3 v, Z' {( ~& X
7 X+ B2 Q/ x' z5 L. p
3、再增加一个函数调用
7 h4 T* h+ [& h9 Z4 A
% c0 \' S7 ?( i I( d9 v
Matlab代码:
clear all
* b5 {3 C1 g; c3 ^( [7 N
f=@(x)x+1;
* j3 q# X' x9 w- W2 t+ _+ n1 z
tic
1 m% O7 x3 C' F
s=0;
4 Q, E1 F: H* R% G+ |
for k=1:1000
0 B8 b$ t2 O! L/ L
for i=1:1000
6 z3 _# ? S7 e, b4 a5 w
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);
$ u2 C `7 N! Q. D
end
6 Z, t2 M7 r1 r& g) ]" I
end
0 l) {7 N( a: D
s
& a$ h7 j \: \) q7 Z
toc
' P1 j! ?0 g: J" n) P! c& O A
/ n7 w. U% ]% b2 j5 }: T
s =
' y& i+ Z+ l/ f7 a3 E4 ]( w
6 C7 \5 i) I, \- O, h
5.1251e+008
& R& \ I) C% N. N' P- {5 T
* ` g( P+ U7 l6 _" L
Elapsed time is 2.173128 seconds.
复制代码
Forcal代码:
!using["sys"];
" H) ?7 @; a9 B% t/ L z1 U' p8 ?
f(x)=x+1;
' b+ q9 }( c2 |/ I7 W' y- n
mvar:
& p; e7 O- k6 V" [+ ^& P( x
t0=clock(),
: z: \+ @2 ?) W1 Z- G: i
s=0,
% A* y; M0 E4 S) l2 K. P
k=1, while{k<=1000,
7 {+ g" q+ e, U2 U! ^% I$ m
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++},
3 h* J& {% S6 G1 C) q z
k++
; l; o% m1 ^7 S# G9 `, \4 o2 p
},
; Z6 ?! n$ w7 o3 Z9 Z( G" }' n
s;
1 o( d$ @: W1 y/ x" r
[clock()-t0]/1000;
复制代码
结果:
: t3 n! ]& I% M5 W9 y
512508953.6658993
* i+ C: S0 J, e& ~5 Y0 [
1.078
0 D: X4 A6 g! k1 A; o7 E
3 ~% `# m) P7 L3 `0 k* v1 k' N
可以看出,Matlab效率已不及Forcal。
y' e% _: V5 ^: U$ h% ~
故JIT加速器虽好,但效果似乎并不明显。
作者:
海水
时间:
2011-8-2 08:12
作者:
forcal
时间:
2011-8-2 08:45
4、在JIT加速器下,Matlab的数组存取效率非常高
- G- S: @5 ]; {9 j2 H! ~
" L+ o7 c9 d [5 L$ z
Matlab代码:
>> clear all
" s8 p* b7 D0 D T
a = linspace(1,1,1000);
) y5 r8 j4 P2 {4 c" N u( Z2 p9 K; ~
tic
u# d$ b4 H- O) Q
for k=1:10000
& {! |' m \" v1 |, W- v F
for i=1:1000
3 `( D* d' i# l/ `( I" T% v
a(i)=2;
# {; h' h/ p! r* t6 q
end
" S! e5 ^' y z+ `& H: ]7 u
end
* q5 N9 A9 u5 K) o) K: F9 V
toc
5 H0 M& C7 B+ a2 l# y3 ]
8 U2 R5 L( c" g. e4 n/ y2 j& s
tic
6 Y1 o* K: c- M
s=0;
6 `* x7 W; }9 \) Z1 D- q
for k=1:10000
) W5 _4 C% L! `2 n& L0 ?) w
for i=1:1000
: r- u3 K# }% a% a) }, A# a
s=s+a(i);
`" e6 P1 @ E
end
/ F; h: q3 B: g# L9 n- @% m
end
1 F7 F4 a j' a9 X
s
! m3 d c( H( E, C/ h
toc
' y) t* l; u! P' f& S' x
Elapsed time is 0.140658 seconds.
- Y5 W1 M- u7 H6 B
$ I* c$ [2 l$ L: G$ q$ r
s =
9 e# g* ^* r4 k2 s8 n8 U
" Q9 d; e$ X+ M; o% h* N5 X2 Z
20000000
1 d; O& U2 v! i: A
8 m3 y( f- c1 U; y! ^6 L& C
Elapsed time is 0.091794 seconds.
复制代码
============
1 \# D3 U% z. W- Q
9 ]1 k+ ~; w$ _; o; i. p' ]
Forcal代码:
!using["math","sys"];
* f. F9 X1 H5 W: M9 r
mvar:
2 D' w, U. B* s: z& X2 P
main0(::a)=
! d. h! `) @8 M9 q& r
a = linspace(1,1,1000),
1 F8 c! ]' q/ y/ l$ B5 r
t0=clock(),
7 a+ \ ]% K& E+ m8 ~
k=0, while{k<10000,
. ^/ n$ l+ v L: l
i=0, while{i<1000, a(i)=2, i++},
( k) I# J$ w0 w% Q: E$ x
k++
( v, U# \- |* A! I3 D
},
$ \( a% q' Z, f4 E m
[clock()-t0]/1000;
+ L& M+ V6 q8 ]) W: y: e
; f Q: G ~% O' T% L) K
main1(::a)=
" f; w; a( Q3 b
t0=clock(), s=0,
* @! t! p" ~8 y% n0 X
k=0, while{k<10000,
% [( s' S0 `. b% m, T
i=0, while{i<1000, s=s+a(i), i++},
& i+ l/ w; h+ R" B
k++
$ X5 a& C( a# u& S8 p
},
8 N+ E& b* W5 H @( J! p. T( F
s;
, f! w. d7 J; m5 N+ |0 E" g* P
[clock()-t0]/1000;
复制代码
结果:
; m; L. _! ]& T) A- ?
15.484 //存数据所用时间,秒
& y" R6 d& Q, x3 b
20000000.
6 Z9 y( |; r+ J' F
5.531 //取数据所用时间,秒
/ X( C9 r& y$ E1 k8 m
9 }% {7 Z+ o$ K8 @8 g
----------
+ r3 _' D3 W) I+ t- }
* C: ]7 A6 Z% Y
用函数sys::A()存取数组数据效率稍高些:
!using["math","sys"];
* C' B6 m6 |# C" y% a% p
mvar:
" {0 l$ c) A% y5 d
main0(::a)=
! U& q7 Q) u8 u! V
a = linspace(1,1,1000),
) B$ h. I8 B4 {* m2 `/ J
t0=clock(),
5 Y0 s, ~1 U' W! t$ O- {4 o- z
k=0, while{k<10000,
# z" O. t! ^% Y- z# V
i=0, while{i<1000, A(a,i)=2, i++},
$ Q6 V4 V& _0 J4 c, F8 a
k++
: i l5 d" v7 A8 M2 P4 `
},
9 K) A8 S, ~# M) u$ H
[clock()-t0]/1000;
3 n. y9 d$ w4 _
' K: J6 m; P8 }) W7 p4 _" S; j
main1(::a)=
# g1 N) k% W( p4 w- v+ H# X, H
t0=clock(), s=0,
- {$ k. V8 Y T: X; }) }* P
k=0, while{k<10000,
, s C' i) r& k3 l4 ~
i=0, while{i<1000, s=s+A(a,i), i++},
, ?& o- b3 T; O3 N4 t6 Z; q
k++
8 @ @$ C# I3 ?4 b" Y6 l
},
: D8 N/ T+ N/ ]/ s( X
s;
w' E( U& m2 \1 { g& p
[clock()-t0]/1000;
复制代码
结果:
2 O- V. j7 F9 A0 N" s# L
10.469
, E2 t- t& O+ m K6 \7 C( C
20000000.
1 C: M6 t7 R1 v$ X+ }4 ^% X0 |6 v
3.781
' \% e& L- B, H1 e+ I
w. t: Q" H# M- s- p
-------
5 `( u: j( R- Y: b- R" f
C! _% s3 u* M) B
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
: d: T. d3 Q3 m% `) R8 x; N
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
% w0 o+ H% a% V1 i5 `
' e' T# d7 O5 J( o7 z8 q
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
& P8 ]( ~ W. B
. n3 m" ~- _" }+ O' d
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
- b% M, @' s( T& a& _
3 R9 H+ ^% G# Z$ ?" l' O
5、在循环中加点东西
" ~ O2 [8 h( P8 Q! Y3 p9 C5 f
6 ^, ]1 N& W# {7 T7 F9 U5 U
matlab代码:
>> clear all
" L1 E7 C- F& B3 F! b) W( T8 K7 ?
f=@(x)x+1;
4 @7 `, I) r9 S7 h5 `' u
a = linspace(2,2,1000);
1 z" h7 g3 b# ]
tic
3 W6 e2 l& \( v7 }) c7 p+ f) j
s=0;
2 z! o$ ~, G" |5 \6 K
for k=1:1000
) ] H& Y) X: Y; c3 V* x, j7 K
for i=1:1000
6 c8 w9 [5 h' s8 j0 @
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));
2 Y* p4 h, b2 n5 S( @
end
: p2 K% G8 I6 k3 ]5 E7 s
end
9 T4 R! `4 `; `4 k1 ~
s
0 d! O, L$ e, w% y3 f% J
toc
0 |7 T/ M/ K. q- L) t9 w
! l/ [* K9 e- H$ k9 @! B
s =
2 v# S: Q9 c F+ l$ k( z
1 X" Z$ K1 A- }6 Q/ J4 {( a: o# Y0 q' H
2.4002e+007
5 x' A( _5 D* _/ O, A0 j: P s
3 o3 K$ `6 s" Q7 M/ ~5 k, |+ g. v
Elapsed time is 2.252997 seconds.
复制代码
Forcal代码:
!using["math","sys"];
2 S, ?" V! ^8 t7 F( n
mvar:
# H+ s& Q& m8 P, f; p# v
f(x)=x+1;
! O8 }/ }- C8 B+ z- B
main0(::a)=
3 Y+ e; q# X* ~% e" \
a = linspace(2,2,1000),
( D3 c A3 r5 H" w( D/ V. m
t0=clock(), s=0,
) E; C+ p, r. ^; D& k* r
k=0, while{k<1000,
! c) `/ Z2 K3 s* q: z4 \1 Y
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++},
4 U- C0 E1 T+ A' Z; w6 c
k++
3 a3 r9 q* u# c) k: o, {9 h% U
},
& a8 r! j: T+ c5 I$ n) j
s;
1 E4 P, x% \8 b
[clock()-t0]/1000;
复制代码
结果:
# @3 X0 F" P- r. D
24002271.69189384
+ N( j* N) H& U; [# V
5.172
; p9 y* f# V1 y, b
! `- }. n; s# J$ S7 K
二者效率现在只有一倍差距。
- @8 K- a7 ~: Y4 I/ R6 [0 F, {! P
8 N& W6 S# t4 {, v4 T
----------
9 U5 R1 H2 U" e+ ^2 C% B
) h# U+ ]) r: G% V! U; u
不过,显然matlab和Forcal的程序应该这样写:
- j9 G5 r) f& H. ?! g1 }
2 _' |0 B9 ^' E y* O3 Z1 g
matlab程序:
clear all
# S8 ~% T0 Q" _$ W# `7 Y, F3 T! W
f=@(x)x+1;
5 M! j: Y& ~% ]# p
a = linspace(2,2,1000);
( F( H% r1 n1 Y$ E0 |6 P) i
tic
8 t$ t' }" a8 P
s=0;
. ^8 S- e; d$ T2 }
for k=1:1000
5 Q' h! t; l v
for i=1:1000
4 g2 g. J. s% e) T6 n
t=a(i);
5 J" J4 b7 ]( }# L
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);
) y9 M" c9 M% y0 O
end
: p, d4 L( J* G" ], u( ]$ B1 @
end
; G! b( C0 F' G3 B
s
: G8 ^( y+ F4 F
toc
" E& u) h, K" S
) z# v& j: ?0 W
s =
$ x5 |+ r8 _+ ] J0 b
2 D% I, g. @# G
2.4002e+007
/ H. |3 t0 b# t3 H- e! k* A
0 A' I( O( k+ ~. C9 V+ C3 w8 m
Elapsed time is 2.043909 seconds.
复制代码
Forcal程序:
!using["math","sys"];
) K: |0 Z" x) G" K9 k% D9 C- G3 t
mvar:
5 O& b8 N+ ?' K& D b
f(x)=x+1;
+ N6 @$ a% Y# \ `6 ~
main0(::a)=
9 n l C9 K& p
a = linspace(2,2,1000),
; A+ Y0 I! w3 K, c* M2 q8 c
t0=clock(), s=0,
. E& I8 g# o# o8 G
k=0, while{k<1000,
2 c+ e6 j' u8 b! r9 l7 O+ ]- Q3 T6 ~
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++},
9 J8 e- s* b1 L) {. o
k++
$ Z. j1 q- w; W8 H
},
4 d2 _; L" o7 x8 S
s;
. P, S% ^0 P/ S. l; r+ I6 u; j
[clock()-t0]/1000;
复制代码
结果:
: N1 J" r8 Z* M
24002271.69189384
8 P( n( S5 Q; f5 e/ b, V% r
1.625
4 @1 d! V: k" g2 D" k) _6 m
% H/ F' B* C# q1 W: v
matlab效率已不及Forcal。
; l* r1 c: P+ H
$ t) P, U7 e( S! S( B
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。
作者:
forcal
时间:
2011-8-2 09:27
在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。
7 H3 L. J) S. k3 {; d- d$ O M
: ~) G0 Q3 d6 n
Forcal代码:
!using["sys"];
3 y: i9 @3 _! C+ `$ i
mvar:
- W) ?6 c9 T$ m+ S: s) z
a="\&\[1000]"/4, //用字符串模拟静态数组
; J, B; H! u' J# I
t0=clock(),
" ^* }# L- r% w$ h ?0 @
k=0, while{k<10000,
% ~) p0 o9 y0 n# Q* s. i W8 ^8 D2 B: A
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
V8 L& g! x; k- Q& f+ L- m
k++
1 v% k, O7 p. @& Q( ]
},
7 i' h# h/ }# e2 q
[clock()-t0]/1000;
1 {$ C' D ~ z+ M7 W+ @
& h g! u6 }* ]4 H0 N
a="\&\[1000]"/4, //用字符串模拟静态数组
0 N8 o& s$ P* V$ E( v0 N
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
1 p/ Q, m% q8 u; d" y4 p: y+ w3 \* @, C4 v
t0=clock(),
4 n0 Y! C9 E2 o
s=0,
6 w5 Z! b. T- }. ]4 N. F
k=0, while{k<10000,
n, v1 x) |% V( s- i6 b; x9 H
i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值
. t9 q3 Q, m9 ~4 \* i. z
k++
9 ]" x. X( B7 C9 u& E; h0 D
},
' a$ `( ~" W' o3 Q2 z
s;
) F5 O7 G D1 Y# z$ H' c* _7 J( r
[clock()-t0]/1000;
复制代码
结果:
2 Y" o' m0 k: W$ Q
0.5620000000000001 //赋值用时间,秒
- S! f Y) E9 t0 R) M2 D
20000000.
$ n- u% O' U! \4 v" Z7 b$ O0 l9 O7 V
0.579 //取值用时间,秒
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5