数学建模社区-数学中国
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
[打印本页]
作者:
forcal
时间:
2011-8-2 07:31
标题:
极限测试之Matlab与Forcal有无JIT加速器的比较
1、简单循环
A) Q) z( l3 V
6 N- U5 l* b# G1 f: d+ f& c1 V
Matlab 2009a在运行以下代码时使用了JIT加速器,获得了和C/C++近乎相同的运行速度:
clear all
! h( l% M/ k! J- V- s5 Z1 s
tic
" o/ H! ~ c5 N4 ~
s=0;
- K L+ p; S" h( n$ Y5 _7 f
for k=1:10000
: N4 d5 H! e- ?5 d n8 g
for i=1:1000
/ f, H6 U8 L5 k& X' z* }! u, Z
s=s+1;
- I3 C" e1 A# ]; f3 |
end
) l2 p; o, Q k& t) K0 u x
end
+ O4 b! S* H( |
s
( S& `, U4 Z! Q n( F
toc
& i; J# ^7 f6 J% w2 @* Y1 M- Q
5 h. D) D! W4 e: {
s =
' L! X8 Z( R" U6 f& b
& c3 V6 K+ T& V- U
10000000
# D# L- v: }. y. k& M; y9 a
0 q2 s- f/ O# v- ]9 }9 E
Elapsed time is 0.092808 seconds.
复制代码
============
( g& P. Z7 N9 u' `
# N+ X% N$ t* |6 ^) @" @
Forcal没有JIT加速器,代码:
!using["sys"];
6 a7 F- q Q7 M6 v$ m& y; `
mvar:
4 }! G+ f4 Y- M. W9 N' Y8 k: Z# Z
t0=clock(),
' r, [7 S% x! G# a9 h7 w- D6 X
s=0,
& |' m+ }0 b( _: J% F) a
k=0, while{k<10000,
7 z; C# h3 L- g) V: j# ?4 u
i=0, while{i<1000,s=s+1, i++},
& c( e/ x; `0 S& h5 m
k++
E& d, {1 I: x/ B2 M, ]2 Z! D
},
9 v/ u6 V5 L9 t6 v1 o; m, i8 s
s;
7 D1 Q' z1 i; l |
[clock()-t0]/1000;
复制代码
结果:
# ^! N; l$ L* |' @! B8 v6 K
10000000.
' U8 M& @& P2 Q. x$ e
0.704 秒
; U; i1 y8 e0 G3 H
k. W. N( K& N" c+ G2 T
二者运行效率相差7倍多。
5 o. w9 J# s2 l+ t; `# P1 ?
]! [# l5 B, W3 @
2、循环中稍微加点东西
' l1 [9 N0 j" ]4 W2 G
( O) L1 {. T8 r
Matlab代码:
clear all
* [0 ~3 {; C$ \3 X
tic
% }/ K* U+ X+ g7 v: j: H
s=0;
: E0 a6 O3 @- X; u2 G
for k=1:1000
0 l; o) S; O* k$ M6 E* n
for i=1:1000
6 Y0 g+ U% p/ _) \1 [
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);
6 N, R1 p5 ~% o9 J6 Q
end
% a5 o6 Y8 G* L M! P
end
* d- Z7 m- n7 _1 v
s
: f& Z" E D) }0 W7 r% ?
toc
# R# M5 u( E5 e
7 z' c5 D2 u; p# g
s =
7 [5 x+ N2 v" a W
9 ]- {* \' s3 z
1.1009e+007
; s# k$ e* s9 q1 Y, o5 V
4 ~9 D% \" B m( I6 F+ ?1 T
Elapsed time is 0.727535 seconds.
复制代码
Forcal代码:
!using["sys"];
4 R$ h1 j5 _/ h" h
mvar:
0 D6 A: q j4 t- z# P+ i
t0=clock(),
$ {/ C: ]* u6 j$ F
s=0,
! g" [0 s& I1 P% r; e9 r% @
k=1, while{k<=1000,
+ e m( \$ x T9 w. l% h8 [
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++},
& T8 v1 S( P4 Z/ v4 u! K
k++
. ?1 A- Z! l) B2 G. ^
},
0 J% b( H2 m; h" Y& Q8 ~
s;
# L- ?4 J6 e, q N; w
[clock()-t0]/1000;
复制代码
结果:
/ D, e7 n# ^: ~. N
11008953.66602346
' u+ t6 \6 D4 ?1 c" X
1.031
' f/ x9 Z. Q3 h" z$ B
, u7 U( K V2 ]- w" l3 b5 f
二者效率相差已比较小。
; W5 k1 @% F# U( x' ^* K. f# u
( t+ h' a- ^9 x
3、再增加一个函数调用
0 z5 v( \- K# p1 ?' y
5 l ^! ?- C, D, y: p" o% j
Matlab代码:
clear all
1 Y2 f6 B: m) |( O, F/ i& z4 O
f=@(x)x+1;
3 C; V* D1 C4 f( o: p* Q. _( e
tic
3 `* Q. c% C0 l" a
s=0;
, P3 \3 E) J7 ^2 D6 Z$ t) O# ]
for k=1:1000
' Q' u4 e6 @% k4 V
for i=1:1000
8 `) Y. n% S: R! g' f, l- b. N7 }
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);
5 c/ k! z$ `4 h" b5 v, i' B
end
B+ h" v2 ~9 D6 ^0 v
end
- u6 ]. s8 R2 f/ M" ]
s
( Q0 O- a6 j; Z, G! D- M) ?
toc
; [2 L0 J% g: o3 j9 G
8 F9 ?8 O: C" a7 o' _& t% _
s =
* F) L) O1 b7 T/ K- z" }& d7 u
2 B7 P* J0 S8 j
5.1251e+008
0 i$ o% q: S: ~
' A1 ^ m9 d2 s- [% u! l9 ?
Elapsed time is 2.173128 seconds.
复制代码
Forcal代码:
!using["sys"];
1 r+ r. }: m- ^4 x3 Y! W# U. u
f(x)=x+1;
( q# s# I- @- B* ^) f0 f7 G
mvar:
& t9 Z8 w2 Q: @' i/ z; X! N- L
t0=clock(),
$ D9 Y2 k. D2 ^3 e" H& L; d
s=0,
) J$ X$ _5 S. ~- D6 I
k=1, while{k<=1000,
+ i. b5 c7 n+ n3 ~; F" \1 T
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++},
8 N8 ^& e3 m3 ]; b- C, L
k++
: |: V& f5 s" M# C+ _2 \
},
2 P- `, D! W& y4 u2 O
s;
$ n/ C, r& Y! j5 j- n- l/ n
[clock()-t0]/1000;
复制代码
结果:
/ ?, X& Y$ Y+ G8 m
512508953.6658993
5 h) m6 |: |4 u( N" \" v; O
1.078
3 m3 [. x4 p5 t# d
) l- r3 Z' C3 }) \3 u( Y2 Y) V
可以看出,Matlab效率已不及Forcal。
B5 e; T# R B7 j
故JIT加速器虽好,但效果似乎并不明显。
作者:
海水
时间:
2011-8-2 08:12
作者:
forcal
时间:
2011-8-2 08:45
4、在JIT加速器下,Matlab的数组存取效率非常高
0 B3 p/ B: J! D! W. T* p
1 l3 T" I$ a5 }7 K3 ^5 a1 v
Matlab代码:
>> clear all
3 e/ x' g( r, J9 c V
a = linspace(1,1,1000);
5 d1 ~2 u a2 U6 o# V1 s# s
tic
! n. j% L! A+ }- W2 I- P0 z: j
for k=1:10000
. c. j6 V) D; `7 c8 J* p
for i=1:1000
$ Y4 Q( c! \( [7 p5 g& v
a(i)=2;
& g7 x/ {' m9 J% L* D4 C
end
$ x6 y" @3 P( H- m+ n
end
2 O" S$ t% y6 U3 ~* @7 W; x
toc
. |+ q1 N) P7 v! l8 ~" n% I
( l( b9 {1 x& X( |& Y9 I6 s
tic
( ^2 ~# u: Y4 d0 z+ N9 M
s=0;
0 Q5 |1 V$ C" e# W: n: [
for k=1:10000
- L2 `4 z$ a1 X: ~& \
for i=1:1000
% G* ?# \; z. K; K# O
s=s+a(i);
: o! |- u3 H: t g q7 O* X
end
& P/ b* Q" ]( n7 G4 t0 S
end
2 Z6 \( [6 L, ^) F1 Y
s
- n. G3 c5 x Z: |
toc
! |% _; c1 `0 N. s
Elapsed time is 0.140658 seconds.
; l& m+ Z" t, b5 K* g
R8 i" W2 R9 Q
s =
0 G ~( {2 x: ]0 e* n
* b6 d) H% g8 Q% P! P2 w! z% y6 G
20000000
" }+ K- y3 j0 m- C; z/ r2 @
+ a. |6 A0 A( H' V& e; u
Elapsed time is 0.091794 seconds.
复制代码
============
- j4 e# n) T$ z3 A
' z- t' l4 Q" f" i& w
Forcal代码:
!using["math","sys"];
0 N1 ]/ A! W% ~& K- Z/ |4 J/ `
mvar:
: b/ I) Q! L: o( t2 }: P
main0(::a)=
$ }6 {# ` ^" F0 G
a = linspace(1,1,1000),
" [7 [4 V: @/ J( b1 q
t0=clock(),
4 P9 [0 c2 b" i+ @- w& _4 Q# G
k=0, while{k<10000,
* f V5 L$ J1 v4 u8 ~
i=0, while{i<1000, a(i)=2, i++},
9 T/ [, H& }% A# D
k++
Z: D5 T7 L, x4 n/ l7 [4 w
},
% J9 b$ q, u" E# g2 h
[clock()-t0]/1000;
; v1 X: Z, C- e9 {; C; R
( _3 R: Y; g! e1 q, P. m5 P7 x
main1(::a)=
T- i: c5 O+ x+ \
t0=clock(), s=0,
' A0 |3 T0 r: t( M* e6 s) t
k=0, while{k<10000,
2 O: @* C7 @6 }
i=0, while{i<1000, s=s+a(i), i++},
+ O$ g, D P5 g$ i3 h
k++
: }% B% X1 p+ g+ h9 @4 v1 v" Z
},
; }, q+ R" c4 g/ @3 d) [% Q
s;
+ B1 b; b. L6 u b7 Y) R( e
[clock()-t0]/1000;
复制代码
结果:
0 ?. t# r V8 |
15.484 //存数据所用时间,秒
4 S, v, k5 W. p# r
20000000.
, p, o. _' J6 Q/ b/ ^ p
5.531 //取数据所用时间,秒
0 s( q" N/ Y5 j1 F
+ l7 \; ]5 Q/ i' e5 g0 R
----------
* b- E' o# D7 V) e. z: u# [
# G, t6 D" N3 Y' y) P! A
用函数sys::A()存取数组数据效率稍高些:
!using["math","sys"];
, k7 q7 G; O' D- x
mvar:
& s2 b, i% ^" B4 h' {1 L% v
main0(::a)=
# z3 b, D K* e
a = linspace(1,1,1000),
( Q( U' ]: W( y1 B. ?
t0=clock(),
* r" o- C$ Q5 _: I* k
k=0, while{k<10000,
) [7 c3 t- W0 Q( N9 r8 Y
i=0, while{i<1000, A(a,i)=2, i++},
8 _5 u6 |( v6 q: R0 A3 p
k++
, W1 n/ B8 B J* A S
},
* b& \6 Y: X" c
[clock()-t0]/1000;
% i' |; g8 S$ f" f/ Z X5 D) Y
" s: A h$ D3 x i
main1(::a)=
0 G: l" a- B& b. Y4 U
t0=clock(), s=0,
! c% }1 T8 b; o- x
k=0, while{k<10000,
4 E3 p8 g9 E/ K" |% W
i=0, while{i<1000, s=s+A(a,i), i++},
3 [7 J1 y4 G2 W) P9 U: q: w7 u$ @3 \
k++
' K2 z' d1 O5 c" O8 j
},
: M+ L/ j/ m Q# _3 Z$ ?2 N$ j8 n& A
s;
1 j, F/ z: U4 N8 w5 ~
[clock()-t0]/1000;
复制代码
结果:
0 g* |3 @' z2 s
10.469
0 i7 x& {3 t; {6 y' J; w0 L
20000000.
7 p# l/ z! ~2 x x. m% @' c
3.781
5 d( N1 h- ^ I4 F
3 |" T! M7 {* C8 ?
-------
* k! r6 a- g8 G5 G( B" P! ]
^& i$ i5 D2 k+ Y
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
# j6 C4 \0 V" N. ~7 u7 S
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
; U, t' Z( I9 ]3 ~9 q7 i3 H J+ N
8 C7 [5 {: a8 y) f- w" D
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
* c4 y5 ^/ F5 S, f9 F- L2 X
3 Q7 H: ]; N" ~' l* Q) M
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
- H$ R5 v/ O# t' o6 I9 |# V, @2 |( H/ S% d
; }, d! i! {4 ]1 Q& f' l4 d) Y/ J+ }
5、在循环中加点东西
5 C1 j* y# f/ r
: E1 b) v9 a/ L" M7 Q. W
matlab代码:
>> clear all
* E* @, r/ _. @$ g* t! D: Q; i
f=@(x)x+1;
3 [- T* k1 X& F
a = linspace(2,2,1000);
6 q/ E& N) J( i, d1 P/ I
tic
6 T+ v* n( b( K+ W' @+ C
s=0;
; \% ~. @' P1 T* K. v& _9 `7 e
for k=1:1000
/ U3 t A# z+ N% `6 ]# A M7 A
for i=1:1000
. g2 n3 T/ S. z0 ^
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));
- E7 l5 D3 W' c8 B! r- d8 R. H/ y
end
$ p* ]" k6 u0 K! h1 K U
end
3 K- t7 c2 }" d, y
s
# q" P' M/ b2 a6 z0 r( D
toc
* r! `' W7 |* T- U) p t' k
f9 q, D% H; h, I. |6 q
s =
- l- t1 l. r( Z/ |5 k$ X7 m
4 m9 A- z+ k( K0 Y
2.4002e+007
# v% m$ O$ P% U# [
, k4 X7 |0 b( h1 F
Elapsed time is 2.252997 seconds.
复制代码
Forcal代码:
!using["math","sys"];
- r; L( e5 U, r2 O8 p
mvar:
+ Y2 X$ j# Z+ w) z% d
f(x)=x+1;
9 Y- k# R+ D& B& D! o
main0(::a)=
) z! A& `+ N( D% h
a = linspace(2,2,1000),
* r% J) G" g1 V0 ^
t0=clock(), s=0,
* Z7 `4 q9 S6 }. U' h7 C% d* g$ @0 l3 r
k=0, while{k<1000,
+ o( I L; e' n M* x1 b$ `
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++},
6 y( \& \9 l2 M; e* z
k++
! P" @. V \% g* s# x" D' G
},
2 x* T* x9 S p( {* Y* H8 U2 \; Y2 P
s;
) h, @1 W- O# u/ d
[clock()-t0]/1000;
复制代码
结果:
" b7 S( \6 c+ D1 g- i+ u
24002271.69189384
5 ?/ T; W8 v4 F% C5 i
5.172
& @. V) Y2 R0 m* r# W. w% |
2 q9 ~0 N( p8 s& r; b/ P
二者效率现在只有一倍差距。
$ I* j5 S/ F! I$ m# ~% k
# D3 @6 h+ j/ V8 `6 F% _( Z
----------
* Q. U: s# q& e
6 W5 M- |( w6 S9 U0 M/ x. G; h7 \
不过,显然matlab和Forcal的程序应该这样写:
$ h7 j2 e# f+ `2 F0 P8 W
( Z- m- E; O$ x; t7 o
matlab程序:
clear all
+ o4 B3 ^! ]$ b" o b* q
f=@(x)x+1;
& S: Z: S" o. T& {& {
a = linspace(2,2,1000);
& g$ a# j" d' z
tic
$ D/ \# Q6 h4 l1 z, [8 p
s=0;
; _3 O0 y4 d2 k/ \
for k=1:1000
- |# l2 l# n, P# ~ { U1 {4 o
for i=1:1000
( J/ e& [. D7 K4 `3 C& s' I
t=a(i);
8 l: |5 P3 M0 S/ T* K
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);
) M- G }4 m; y( f2 Z
end
4 ^ d# d0 i0 d2 V7 P; u7 [! I
end
8 l* r x, L1 y* v) e! b! n9 k
s
3 l, I' T6 R" d0 [
toc
! w5 `: D$ u0 B8 i6 ?. S
, V! g8 E* h6 a. i/ X
s =
: Z& g! `+ g8 t; {& ]
! h$ {& y5 Y2 B4 _9 t. w. C
2.4002e+007
" Y4 \2 e/ c' k& u
4 D) |3 _1 Z, ~
Elapsed time is 2.043909 seconds.
复制代码
Forcal程序:
!using["math","sys"];
) E6 t! n! G9 H: |9 f3 X
mvar:
* ]7 F$ H6 D' |7 B
f(x)=x+1;
+ q, X- F$ ]9 m
main0(::a)=
- `. F* \ ?+ m+ T3 C0 I4 d3 M
a = linspace(2,2,1000),
# Q1 X6 @( A6 l" ]. [
t0=clock(), s=0,
; K, {: w4 R1 R% h r) m/ n3 A
k=0, while{k<1000,
; Q$ N" c+ p( K( {* d! j4 G( \
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++},
: f& G& F+ M, \& G, c* A4 g, d: S
k++
0 W8 U/ L: } Q) ^' i+ }
},
1 r( L- z2 Y7 a
s;
# o1 ~% v, d Z2 S0 a( m3 m
[clock()-t0]/1000;
复制代码
结果:
. z3 H( G& d7 P6 v5 J: `
24002271.69189384
& R8 O4 h3 B Z
1.625
% [- l s1 V$ M& ~" U: g
$ ~) s+ |; Z1 a8 X% z7 D- ~
matlab效率已不及Forcal。
8 l! V8 S# a+ T3 t5 J- X m% h0 p
# K. p+ T) }1 B% s5 i. p. S+ g
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。
作者:
forcal
时间:
2011-8-2 09:27
在这里顺便说一下Forcal静态数组,静态数组是用字符串模拟的,但数组元素存取效率非常高,约是C/C++静态数组元素存取效率的1/5左右。
* A; e" `2 |' K# w: }
* g" O4 f4 S B. {
Forcal代码:
!using["sys"];
- d# X- {+ x! q+ C) S6 F ]
mvar:
. ]9 y$ `2 o1 Z9 ]0 h" I$ n/ l
a="\&\[1000]"/4, //用字符串模拟静态数组
! l, E+ H# U7 b, i3 L, b$ B* x
t0=clock(),
3 w' w! d: i; s, P
k=0, while{k<10000,
' j! S' n% \, g& G+ U
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
L/ h0 o* p3 H2 h" t
k++
+ ^; T# p' Y" f/ Y6 O& h- g
},
) m% ~; s% Y6 N6 Q* a) ~ z! t- r
[clock()-t0]/1000;
1 {7 \4 W" @1 X5 z& r S
0 u! p3 E9 k* v
a="\&\[1000]"/4, //用字符串模拟静态数组
, Y/ K k" l# c4 r
i=0, while{i<1000, setn(a+i,2), i++}, //用函数setn(a+i,2)对静态数组元素赋值
' @. {( N, g/ q4 V7 [/ v
t0=clock(),
9 ?7 Z9 X/ `7 D3 v# ]5 W+ S
s=0,
7 l( f/ U$ q( V- ^/ S
k=0, while{k<10000,
5 D8 W, h$ S. Q: c: _* a# ~( T
i=0, while{i<1000, s=s+getn(a+i), i++}, //用函数getn(a+i)获得静态数组元素的值
: ?1 s; s( W0 _- _3 S, `3 P
k++
5 U. o9 A3 r* u
},
( Y) m- q2 J6 Y
s;
) e7 \4 M5 H9 S! D; D
[clock()-t0]/1000;
复制代码
结果:
* s! s. d+ @! t* G7 b
0.5620000000000001 //赋值用时间,秒
: y2 d$ z9 I- h: b" x7 g3 j* l8 Z
20000000.
( b3 L5 g$ n _! n+ _& |
0.579 //取值用时间,秒
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5