数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
[打印本页]
作者:
forcal
时间:
2011-8-2 07:31
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
1、简单循环
; ^; y* B2 P( x
/ S; T% a" z' w3 i
Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:
clear all
# C' i K- g7 v0 K( a
tic
$ L/ u* L/ Y" X6 I
s=0;
$ y3 y/ |& ] b# | A
for k=1:10000
. V9 H3 g* U; R" v
for i=1:1000
: d" z* k2 l1 S% @
s=s+1;
: ]# e0 S4 A+ F r6 {) ]0 f
end
8 ]( [( `9 T1 d5 o2 }
end
- v `3 ]5 V: [' l6 B9 v( @
s
8 D* k" P4 p3 J+ Y/ F6 g% L
toc
( L1 c% X5 ?" p, Y; f; e" t
9 K& \/ ^& |, s6 t( {2 O
s =
9 _2 S. k+ o$ ~1 `! }( g) u, y5 q
% U+ X5 l+ ?$ |
10000000
1 E+ K% V- Q7 e
+ J$ g4 z7 c( D4 z9 y
Elapsed time is 0.092808 seconds.
复制代码
============
! l: }9 y( A8 S
: J, f+ z' w6 y0 g/ }) F
Forcal没有JIT加速器,代码:
!using["sys"];
; V0 l3 p4 _2 v% g# @6 e6 j6 K
mvar:
1 R7 M/ c, I) g# M4 B$ s4 [; }
t0=clock(),
& U5 Q7 x6 s2 O# [! ^' ?
s=0,
8 p7 ^8 c8 V; m4 i7 [
k=0, while{k<10000,
7 r3 C! M' F1 d$ q
i=0, while{i<1000,s=s+1, i++},
- T/ o. N% j M
k++
7 \& V# l8 D3 `1 @- x, c* C
},
" G5 A* q1 u8 g* I) Z2 H0 f5 G% {
s;
2 k: N/ V! s# ^* I$ Y/ p/ e
[clock()-t0]/1000;
复制代码
结果:
6 `7 [( m" S' X2 c( @" U2 c& l
10000000.
! ?' S6 u. U0 r, a5 X. }. |& o/ J
0.704 秒
4 Q- `& k. u5 a& K
e) M4 g. C+ G, F' x' v
二者运行效率相差7倍多。
( `9 L) L# Y2 ^- e
* }) L7 D+ v4 m3 M! O
2、循环中稍微加点东西
1 V( u0 L; H$ A C, l" C
; G. y s0 P% v2 Z
Matlab代码:
clear all
. H+ j' q. q0 k! o
tic
% |1 b N1 {. w- }# x
s=0;
1 O7 ~, @- y8 D3 b$ G
for k=1:1000
9 }" s6 E# X# h
for i=1:1000
4 `4 [# k+ a, I; y& g( e
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);
4 @. P" Z( E `% i4 _: {, ?( @
end
' ]5 p. S/ T/ _9 C( a
end
/ d8 a% q- x/ W. t8 ?+ X
s
6 {$ O3 j. a4 Q/ D8 v
toc
5 @9 E9 m' b# i0 \. H! ~
/ ~% e7 g# Q# H! ~( J Z5 n9 {/ S
s =
) N N: \+ N4 ?6 o# k
5 ~0 D: y, _% {% I' R1 |
1.1009e+007
! I- R4 {* y6 D9 u
$ l1 _5 T; P. p6 R% b
Elapsed time is 0.727535 seconds.
复制代码
Forcal代码:
!using["sys"];
6 `! C4 ^# V) R+ D
mvar:
* g" `7 {" q1 J6 a
t0=clock(),
# T% K7 h! k+ A/ u4 r, {# J
s=0,
5 Z* r9 x3 e$ m+ A- k
k=1, while{k<=1000,
& l6 C3 H y- ]9 e8 M9 L
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++},
: d; e" d( [; c6 z% Q6 m
k++
. }7 C! }& ^ R4 }# v
},
5 s# {. u! p+ D- Y) I
s;
9 H: N7 {* x- a& R5 t* R) |0 B
[clock()-t0]/1000;
复制代码
结果:
9 [! {6 D, R. Q. ~$ l$ [8 c
11008953.66602346
: p; n% ]$ q' z/ f: H: E7 n
1.031
4 N$ H* ~7 ]/ C
0 z# R* W# {4 U4 R; y& f
二者效率相差已比较小。
3 \1 I" t8 n2 I: l$ F4 m+ G
- J, T8 n O. T" F; Y, C
3、再增加一个函数调用
5 z$ Z$ e. X$ d* E3 P8 z8 h
+ c4 x' C# _: K8 Y7 Q {
Matlab代码:
clear all
* B9 C! T" D$ }% d; ~# u7 d. N9 k3 G
f=@(x)x+1;
9 @8 a( d: S3 q1 Y' ]; K6 F( ~
tic
: h2 L8 m8 k1 g# v5 l
s=0;
( R( O* \% v* N/ \ F& Y& q: \
for k=1:1000
' A) }( u3 u+ [" ^( K b
for i=1:1000
. a R. l% J0 ^
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);
, r( |* d$ f* S! _
end
% S' m& c, n6 w9 S1 Q9 {$ h
end
2 r, _- Y" S. m" ?9 k. v
s
# o" A5 K* f7 V8 I) {
toc
& E( `: h+ _4 W
: _7 P% p8 z) Q* E6 K% S: g; M* \
s =
, Z# Q+ T# Y: x& Y6 y R2 e
4 G7 ?% u7 `+ [* |% S
5.1251e+008
: t3 ^3 p' ^7 R" Y
( i% l( T1 ~9 w; |! B. u/ }9 i) x- [
Elapsed time is 2.173128 seconds.
复制代码
Forcal代码:
!using["sys"];
% O& b5 U3 o- w" N
f(x)=x+1;
9 ~7 h% D; P4 T6 K
mvar:
" w1 ?' D3 x0 v8 s
t0=clock(),
2 b' E2 H6 V N
s=0,
8 x/ x: m+ w5 K4 m5 _
k=1, while{k<=1000,
" m& c: j; D0 _/ F
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++},
/ f; K2 X+ O8 N' Z* y1 R
k++
% `- K! }1 t: L0 T9 I2 i$ c% v
},
. a- j9 V# v7 V6 ~$ `4 n \! o2 w
s;
|) [1 j: m+ m/ v* G
[clock()-t0]/1000;
复制代码
结果:
# N" P* C$ Z2 T- j1 C0 ~* R
512508953.6658993
2 E/ J& Y( Y* j8 z
1.078
' t8 F- o7 V @( T. C2 I8 m
) |) Q9 L6 M' c; k/ `" z$ c
可以看出,Matlab效率已不及Forcal。
( ]9 n0 k5 |* \0 C! a
故JIT加速器虽好,但效果似乎并不明显。
作者:
海水
时间:
2011-8-2 08:12
作者:
forcal
时间:
2011-8-2 08:45
4、在JIT加速器下,Matlab的数组存取效率非常高
8 E4 R* f$ V6 n- U9 w. ]) a
" d' F# Y( b G
Matlab代码:
>> clear all
2 W; Y: L) A$ D1 ?) B
a = linspace(1,1,1000);
+ _1 k) m3 ]1 h+ }# i* K* `
tic
4 ^1 x/ G7 y8 x. W
for k=1:10000
! Q; [2 j8 s( U
for i=1:1000
3 u$ W, n, l2 P6 ]
a(i)=2;
8 {, P0 y6 E; w: `4 I. H+ l
end
+ M" g/ n+ M7 P( _: }- T
end
4 z- E, {; Y$ P& n( z ~; P
toc
8 i) j) e/ n% m7 X# }# d
, I& e. P% n0 X8 | Z
tic
$ ^ D% q+ n u! f& z6 e/ H, H+ s; a3 p
s=0;
3 c4 z! U, h. X9 t: [3 v3 |
for k=1:10000
/ z: D9 r! f( D
for i=1:1000
4 ^0 C7 v/ _5 o' G
s=s+a(i);
" Y0 K0 N5 O( X9 p
end
9 ^% P) K* A6 i) n# d
end
% ~6 q7 @! ?0 ]6 E, I' E
s
/ u6 y! N% H( z) S& n- i
toc
/ J- M9 G" u4 X4 z$ E. c/ ~0 j3 y: O8 B; m: O
Elapsed time is 0.140658 seconds.
4 m9 Q7 i; i, x
, p3 Q- _ A7 H
s =
. {) ~- I1 O; y( f
5 j6 S) d! W( h4 F' j. ?2 G& D) u
20000000
7 r' g4 _' b: U& z0 a# O ~' U
$ p$ K; G& f9 |/ ^+ s/ `
Elapsed time is 0.091794 seconds.
复制代码
============
K2 q2 @% M. `
9 t' _$ `8 \3 f% p- y* a9 L
Forcal代码:
!using["math","sys"];
) D- r9 c) U0 X3 Q: G' G/ h
mvar:
1 w% L6 S8 v0 k r V& `2 Y
main0(::a)=
/ I$ T, E4 b5 @# ?1 A
a = linspace(1,1,1000),
! v7 f b" [6 J
t0=clock(),
' J/ {2 I# b) i6 ^# w0 v
k=0, while{k<10000,
! p; t: T; ]7 c$ B* u$ n
i=0, while{i<1000, a(i)=2, i++},
# t, C: j0 M1 k8 ?6 Y# |
k++
! c/ [: }9 \& \; Y m( }
},
4 m$ Q# z+ t2 X4 ]5 e3 p/ \
[clock()-t0]/1000;
4 D" R: B+ E ~3 V5 b
5 v1 ?! c4 \& T) L7 L$ E$ t( y7 k
main1(::a)=
/ X7 c* i- Z T3 z7 i) R
t0=clock(), s=0,
9 h! p# i j5 l: f. P7 N: v# L7 Y
k=0, while{k<10000,
- t9 I9 {) ^" R# f: K2 _6 l% G
i=0, while{i<1000, s=s+a(i), i++},
- z7 k$ M! ] e- x0 u! r
k++
+ q2 F% {' i" q
},
2 k! h/ |# d( d$ `) O/ D# n# r+ }
s;
, S5 k, Z6 A( ^2 _, b9 \
[clock()-t0]/1000;
复制代码
结果:
8 H8 s! x% N% I- `! }
15.484 //存数据所用时间,秒
, K. h: ~! I4 v" V1 U
20000000.
" ~& c# r" }: m6 u% l
5.531 //取数据所用时间,秒
' r' z+ d3 e4 o
4 N; p) @; }/ M- G; B5 U# W
----------
8 Z+ A! G; Q s% _, T# u* o3 {
9 L* J% v, m+ e* H
用函数sys::A()存取数组数据效率稍高些:
!using["math","sys"];
, M% Q0 N5 |3 k) u5 m% i+ ~/ b P
mvar:
# }+ i% l1 A+ O
main0(::a)=
3 D2 m- \0 k& e0 h. V
a = linspace(1,1,1000),
( \" }/ [& }* |- x$ S
t0=clock(),
, h$ R- b/ b1 T1 B2 M. d- |/ s) o+ |
k=0, while{k<10000,
4 V; I1 y* P0 m; u
i=0, while{i<1000, A(a,i)=2, i++},
; x6 z$ c- Z8 A' n4 s
k++
/ D% n, m1 w, k8 {# d
},
2 J" g! g! Y( o" q. P( t E5 K2 l
[clock()-t0]/1000;
1 m& o; \% g# D& y
4 @& h! {* X' @& a3 M6 q" l q4 F
main1(::a)=
2 H1 W2 c8 l- S' p+ V
t0=clock(), s=0,
6 J% [9 E9 n+ u+ L8 \" l6 ]
k=0, while{k<10000,
% p# S7 i. S' L W
i=0, while{i<1000, s=s+A(a,i), i++},
1 _8 a" f; v" Q; C, v& E
k++
+ r( O4 V. z a. Y5 L
},
, j; c% `3 @3 z
s;
: i: j* c/ c( _+ ?& l3 j4 D
[clock()-t0]/1000;
复制代码
结果:
- s: X2 [5 P- f0 ]) {& c
10.469
. f& t) l* n9 `6 d4 s( R! f
20000000.
Q3 I3 h9 A3 P* M
3.781
3 K/ O5 U! A* h) O
' q7 O& `) W _/ B
-------
5 M) O, p9 A# x$ L o: C
5 ]3 |0 o2 c# G5 x' Z
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
" _* p6 y7 G+ Z
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
4 b1 `- `- E/ l4 w' ]& s
7 L0 D! I) V. `! W/ o
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
% ?5 @* {/ ~7 k2 o N
& W0 Z" S: A; |
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
- e& H5 }1 z4 a6 z
1 h9 ~1 x* ]/ ]" B& o- U. W* w
5、在循环中加点东西
9 a1 |2 V1 n/ |5 {
% Y' g( r4 A2 n& Q- u- |9 L' ?
matlab代码:
>> clear all
% w/ ?* V7 N( x! `1 J
f=@(x)x+1;
! i4 ?" o g- t6 D9 @3 p
a = linspace(2,2,1000);
" l9 t# A: |5 S' } |
tic
4 S; i# }( y) g/ G* P
s=0;
$ W1 n3 F ~2 @% V6 f% D
for k=1:1000
, J6 c# E. e( T( M
for i=1:1000
7 f" g( `( h5 [' 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));
2 q+ L7 o$ P: _6 ]/ \3 i3 L
end
( }9 z! o! j) a- ]
end
( T" h# b" y* t5 A) h5 T
s
4 w0 S: g: C. V3 _5 [$ T, g
toc
) C% |; U+ q) ^, J9 ?; `" X
% }# k7 x" S! B; u Q) b4 Y$ y
s =
7 w2 K& S) ~" S: D& n. s3 [% o
: L2 X$ e( A/ N! M0 G1 H9 |
2.4002e+007
) u; V& h" z# ^$ }# e1 \
! z1 f$ }6 g; {7 L) E1 T2 u* R5 w9 q
Elapsed time is 2.252997 seconds.
复制代码
Forcal代码:
!using["math","sys"];
: g+ C* N# c, Z, ?3 d
mvar:
1 B& q6 A) o, O, R* T4 w! g- b
f(x)=x+1;
- z5 I5 m* M- }4 `
main0(::a)=
! J: P- q/ M. M$ i( z, }% U! l( f
a = linspace(2,2,1000),
7 y8 H R; A ]5 a0 b& s) `3 W J
t0=clock(), s=0,
u1 J! ]8 M% f* }- I7 \/ D
k=0, while{k<1000,
0 n9 u; }/ S/ u# ?9 `+ v* B6 c" o
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++},
' @( @" A" e$ ]- Y3 @$ M1 S! Q
k++
/ k2 J, M, d6 e8 B
},
* S4 b5 k3 F1 d3 I* e" b
s;
' T: v* V4 N; E+ l7 k o
[clock()-t0]/1000;
复制代码
结果:
8 q7 o P7 P! h, V* q8 K
24002271.69189384
* s+ t5 }+ ]" i5 s- R
5.172
: C E9 Y' V' z! ^) S
/ K: O% Z' U9 w; F5 I9 P2 K, }
二者效率现在只有一倍差距。
. l: ~" P) H9 ]8 e
) [: c1 z2 p2 X8 U
----------
1 W& g2 Z. F! V, T- `' U) F- x& C: c
% t( k# A. a6 {: N" e
不过,显然matlab和Forcal的程序应该这样写:
( Q1 q4 ?9 K$ N- L: N8 ]
6 T8 @$ ]+ P' R* _, t" m
matlab程序:
clear all
' X4 R/ Q3 n; C2 `' ~
f=@(x)x+1;
+ X0 |2 E! z, t8 m3 c$ N
a = linspace(2,2,1000);
, P p V7 z: W0 @8 N t
tic
- {9 y- V$ e' D' @7 K9 Q* l/ b
s=0;
) @" m4 Z! x6 Z& u) B
for k=1:1000
3 K+ X3 ~" ^0 M2 a* T
for i=1:1000
7 N8 T6 ^9 d9 n7 h
t=a(i);
/ c& r: {# h# p; b% 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);
8 q+ K. \' l, A/ J$ ?
end
! s2 i5 D; A& s8 z
end
3 b- l7 \, R3 i& k% w: j
s
3 b- X) p7 D7 d, r, M
toc
. r6 g* j( Z7 Z2 `
: X3 g' ~, |4 v# k8 l
s =
5 b B; Y% N3 U' G% G1 Z9 Z
& F- y5 s8 J8 r. X ~
2.4002e+007
9 J* V' r: S( d6 Y$ n$ a
2 R: |5 X& L% C! M8 R) K
Elapsed time is 2.043909 seconds.
复制代码
Forcal程序:
!using["math","sys"];
5 [9 A6 k9 D. l O1 W8 U
mvar:
$ i5 {* D- d! V/ P* M
f(x)=x+1;
1 _3 P1 A# n1 c! F3 r8 L5 `( `
main0(::a)=
, v1 A. P6 p+ N% s4 X3 t" s- P
a = linspace(2,2,1000),
2 R3 b4 C U/ { L
t0=clock(), s=0,
9 n' }/ L0 \8 k# K5 o
k=0, while{k<1000,
& Y$ w* [$ J9 ~) b0 c* i
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++},
& ~' O5 d u3 W; v
k++
+ C3 ^* H h$ X; N6 I
},
1 E$ `, u0 X# o5 ~0 q Z1 m. i
s;
2 R. r7 r5 W: m9 ]7 L
[clock()-t0]/1000;
复制代码
结果:
0 {! h5 G# I3 {) M2 x
24002271.69189384
6 D6 s8 c2 P$ I. I" G. J
1.625
& D- V' b9 s B
; K% d* P9 [! r8 `9 N& T5 h3 ?$ n: ?% L
matlab效率已不及Forcal。
+ h: ? M. n0 Z0 G" M
3 H' T! W; G/ J* k! V( Z- u
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。
作者:
forcal
时间:
2011-8-2 09:27
在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。
- p' a% p6 |7 K2 o! x% j& {
. H( F4 w6 \1 O) Y
Forcal代码:
!using["sys"];
! [+ g3 [, W4 w# R6 U
mvar:
8 ~2 c/ w7 D& u; \
a="\&\[1000]"/4, //用字符串模拟静态数组
! R% N% G; b8 O# Z0 s, g, | Z7 l/ V
t0=clock(),
0 S0 r2 a7 `* U" N F
k=0, while{k<10000,
7 b7 h ]. O" {- A u
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
/ g7 h* c" E8 Z' y- Q" D& l1 ^: K
k++
+ q E& `! }1 @4 P/ V
},
- Y6 y+ i) ^6 c, m
[clock()-t0]/1000;
1 g9 f$ C& o1 e w) k" n
- O; `0 l1 k3 e) L" N
a="\&\[1000]"/4, //用字符串模拟静态数组
: ^) t6 B( c" E3 K4 d6 ]
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
% W5 v9 H4 q3 }) G+ R
t0=clock(),
e1 w6 ?4 i) w2 w( A5 m
s=0,
: y5 u V0 _+ m( ?" Y! W
k=0, while{k<10000,
Q5 b3 P* E; D' A F
i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值
) B" ^, L# P7 w9 z7 b, w
k++
0 a1 x& j0 H |* M
},
4 {" l1 J# t3 k# B; j5 b9 _
s;
7 w" {" c7 B7 O2 s' E
[clock()-t0]/1000;
复制代码
结果:
3 d3 ?( h3 X+ e, V2 I) i: W
0.5620000000000001 //赋值用时间,秒
T+ U2 y% B3 m
20000000.
$ f! C$ v6 q* r" f
0.579 //取值用时间,秒
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5