- 在线时间
- 13 小时
- 最后登录
- 2013-12-8
- 注册时间
- 2010-5-13
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 399 点
- 威望
- 11 点
- 阅读权限
- 30
- 积分
- 282
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 97
- 主题
- 45
- 精华
- 0
- 分享
- 0
- 好友
- 1
升级   91% TA的每日心情 | 难过 2012-8-27 18:22 |
|---|
签到天数: 1 天 [LV.1]初来乍到
|
4、在JIT加速器下,Matlab的数组存取效率非常高
) Y% y6 G5 N) b. z. a/ P0 r' C- v6 }% f& |% r) @# K
Matlab代码:- >> clear all+ T: v1 ?9 P, j0 K\" F
- a = linspace(1,1,1000);
Q1 I1 p' b5 z - tic- ~ ?/ b/ x! r. K$ z7 Y
- for k=1:10000# ^9 y. S6 x5 i4 Z6 ^5 A
- for i=1:10009 u p1 m! [. v
- a(i)=2;6 N( X\" J- V; \: Z, Q
- end
& `5 I8 e& Z. S6 g( G8 m3 ~ - end+ S; k# m+ u- H5 v- a, Q
- toc
( y* E! X4 C3 c, g5 } - % O* Q2 n7 X) X2 e/ C5 w
- tic, e. G4 E: x0 K. L( _& C
- s=0;4 G# T8 P' s6 p/ I
- for k=1:10000, G* m- K; h. u! C U\" F q
- for i=1:1000* @0 ?# l9 A' n) z/ B8 R P* U
- s=s+a(i);
- n3 Z: P8 w- L( d - end3 _- m3 s% G5 J& n+ X/ d) }! E
- end
0 J3 e1 o7 U* Q' Y& \ - s/ ~: p- |, [# N7 h
- toc& b\" K, z! U k# X4 u\" W
- Elapsed time is 0.140658 seconds.
) W$ A2 D) U% ` - \" d, ]6 a& P6 j5 C, C( f7 F3 k
- s =
: x9 J( Z# s9 _! ?7 B
4 q2 P |0 z( Y7 \& _- 20000000; V. N* {\" z3 R/ w2 k, ^
- 7 v! \$ L# h0 K8 e. [6 f7 w
- Elapsed time is 0.091794 seconds.
复制代码 ============" } B3 X, B# u
" x1 x" f! y9 n+ A& c5 M; L
Forcal代码: - !using["math","sys"];
- 6 ?3 w8 P/ L! {( h& F
- mvar:$ b3 V* Z$ P; Q) C8 [2 r8 r
- main0(::a)=
- ' U/ ?* l% M' ]/ T( b
- a = linspace(1,1,1000),
- , K8 [' z\\" G$ C3 o6 I3 `, `# ^
- t0=clock(),
- 3 ?& I1 ]: e. s- S1 N0 D
- k=0, while{k<10000,
- & V1 K; Y% S, C5 Z. l3 Z
- i=0, while{i<1000, a(i)=2, i++},+ T, a$ S, j1 `6 T( |/ e) D
- k++3 x* l- Y( a9 B- K4 s3 Y
- },9 Z5 Q# V# I9 a! p# t
- [clock()-t0]/1000;8 T0 V. {3 L! \6 [4 b
- 3 B2 L P* j- E/ Z
- main1(::a)=
- ' C+ ?# L. O6 v. w
- t0=clock(), s=0,
- 0 `6 z O8 }( o5 K# v0 x, ^) P
- k=0, while{k<10000,
- # }\\" o) K' P1 S K% B' Q# n
- i=0, while{i<1000, s=s+a(i), i++},- x5 B% N5 o% n# d8 F5 F+ J\\" N1 b
- k++. Q5 s* Q) `$ F* s7 K: j
- },2 R# _5 p4 b( J
- s;4 ~$ c; E: R2 H\\" {8 E
- [clock()-t0]/1000;
结果:
" C* M7 x# E8 r7 F15.484 //存数据所用时间,秒
( p" t4 h4 z, F! W20000000.
- i4 j. z: u0 }/ E5 R! m* ^5.531 //取数据所用时间,秒
# a' [' k4 i- s. h [& {6 D
( Y3 j1 y2 V. P- n----------
/ t7 \ w! e1 o# g9 c
( @. t6 s; Z7 R H3 ?用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- $ ~7 U# o6 G/ ?
- mvar:
- ; n8 ] c8 g4 a, @( K9 |2 p
- main0(::a)=* n6 ?6 u, {$ n! V$ k, H( {
- a = linspace(1,1,1000),
- : u( k7 m4 C! C( y( Q2 n3 |1 ?
- t0=clock(),
- % B+ p5 {- j) d5 X, D# g$ q2 [
- k=0, while{k<10000,% P+ e2 t; g6 q8 L! z
- i=0, while{i<1000, A(a,i)=2, i++},
- / q' m( Q1 A+ p9 D2 O% J\\" w, m& a2 ?8 v
- k++: u0 @% [ w! M- K, K
- },
- / O: r8 ~4 ? r) Z$ C' {
- [clock()-t0]/1000;+ g% w$ X\\" I B
- + f8 f0 O# T; N4 v4 F& y% w3 K
- main1(::a)=
- 6 X* E\\" Y$ F& A; C7 p
- t0=clock(), s=0,\\" r; o% P$ b\\" m3 a
- k=0, while{k<10000,! y% Q/ l! q4 g4 h' ?
- i=0, while{i<1000, s=s+A(a,i), i++},; m) J* r; b A/ e' s
- k++
- 3 v9 K0 C5 q. s6 }. a! _
- },' q) M: z2 c2 W$ n: f6 C- Y
- s;& V7 k8 D r4 I+ S\\" x9 J
- [clock()-t0]/1000;
结果:
1 g5 {/ ?: B# i% {/ ]7 s5 X& [10.469; q/ d- X7 P% Z8 e) E
20000000.1 H$ I! ]# p+ [& j$ W( n3 Q8 B5 E
3.7815 {' n1 @$ o( [
2 G: }$ g1 ?# C0 T& ~* r& f' Q
-------
: |& U) n: K3 A1 X% L5 j& E
. I m5 i Q* C& P% P- v在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。' [+ r7 _( F% {/ ^2 a
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
/ c3 V- V/ Y+ h) z. h A4 G3 C9 |" u4 G3 X9 b
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
. _9 x3 A. C- n8 C) ]+ S; }
( B6 m: P% E! Z, I+ oForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。$ \, q! _8 A& W# U, n
5 E8 K, m# i6 G0 o6 `7 k3 \5、在循环中加点东西
0 z5 e) {6 ^0 Z7 e1 u: q& T" w4 w! l" ?/ o* K% q9 u
matlab代码:- >> clear all
; C$ m. x ~$ K: @# G - f=@(x)x+1;: k) {1 s' U3 d2 x1 X0 o4 \
- a = linspace(2,2,1000);9 W( G! Y+ L8 ?' E! E
- tic1 p9 ^4 ^7 y# F1 ?
- s=0;: L0 D/ ^8 f0 G$ X2 f m9 |3 R
- for k=1:10006 B3 E7 Y0 S7 u1 M' _; d
- for i=1:1000
2 _$ L3 e; g5 |1 Z: q3 c% z D ^ - 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));
5 z( T\" d\" ^1 |# T/ o& G1 k - end k0 _* M1 H1 n
- end! L+ D, m% w N1 G# b% a
- s# |1 B( M\" T' r
- toc
6 q. l$ P: I2 F\" K; g1 i( N - h* n$ d* v u2 W( b8 v+ a
- s =
. b# A1 }) C7 h - ) ^2 V' \0 @* F0 ]
- 2.4002e+007
7 i# E6 c# ?: l2 o1 Z( P
6 J: l) r+ ^# \. f- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];
- 8 `. S6 F @5 o9 q
- mvar:9 r% O- N. B, }9 S
- f(x)=x+1;5 P6 H; e8 i- E$ t, i
- main0(::a)=
- 2 d1 c# \9 Z) ^: c9 j
- a = linspace(2,2,1000),8 ]5 X8 k& [. s X
- t0=clock(), s=0,
- * i8 ]* Q! B m1 W7 j. |1 C9 Z
- k=0, while{k<1000,
- 5 w* u6 S1 h X f$ X
- 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++},
- $ l6 ?- W% }! e I
- k++, i1 g' b7 C& z5 {& T+ j
- },3 Z' X\\" E( Y) `- u
- s;
- 4 Y( [% S7 s* y7 {2 _- A# A
- [clock()-t0]/1000;
结果:, p2 r# X& `$ v
24002271.69189384
/ k( c0 a3 A1 X# X3 ]/ S" I5.172& o [0 Z3 i( r8 r! X; ~. O4 I! @
) g6 l$ C! _% H- {* e1 T% h" c: J: f二者效率现在只有一倍差距。0 p5 H; _/ M! x1 j
, Y( ^$ Z4 o7 f# u8 |----------
" x1 [2 b4 @' s$ z7 I4 Z8 W! p0 f% ~0 r9 E* D
不过,显然matlab和Forcal的程序应该这样写:
; {" @! k8 U4 l& r* A9 O" g6 Z0 N
+ [: B: }3 F" B6 h) qmatlab程序:- clear all5 \, a4 N `/ v3 ~3 i1 l
- f=@(x)x+1;
5 s* d' [4 B) c: B; ]6 f: J - a = linspace(2,2,1000);9 p( |# n: [; K. J- \, ~\" T
- tic& |7 E8 T. L4 G7 a5 j
- s=0;
) E3 U3 z. l I- f - for k=1:1000: w7 \7 j1 Z6 q# u
- for i=1:1000
7 m/ A\" ?* C2 I: V d1 G* N& k7 [4 P - t=a(i);2 l. {% ]- z\" Z& k; O1 t/ G
- 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);
, ~) l2 ]: J6 O) b8 x8 T3 k - end
t8 n6 ~' K% h' f' _$ Y - end3 O8 x! ~ p) z+ j9 `- W
- s
; c5 s4 F6 Y. c; U - toc
% ~5 y& k) h4 C c7 |
1 l, o3 J7 Z. m* E' B- s =
\" h: n( |7 Z* A* x- g8 c - 9 @, O\" i- C4 `& W H2 [# s9 }$ P
- 2.4002e+0075 ^$ J$ i1 i( k* c8 X: M
+ a- |5 B7 ?% k( a- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];+ S8 c* E8 h0 T
- mvar:
- \\" V% D5 S5 ~+ Y* X* y
- f(x)=x+1;$ o' |4 e3 @) `
- main0(::a)=: C5 k$ Y9 Y; _0 E* }
- a = linspace(2,2,1000),' M( ]+ C. Y: g, }
- t0=clock(), s=0,
- ! x5 i0 d. G! J- l1 c
- k=0, while{k<1000,2 j* g& m8 U5 ^
- 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++},
- , v* o; t8 L r! Z3 s/ c5 e5 y
- k++
- 9 Z* C4 ^ g) x7 p/ k5 ?5 O$ K8 \' V T
- },
- ; U6 i x0 B, u. @+ h, N
- s;
- : m2 y% q: f/ _: p, F( f9 R, `8 o4 z
- [clock()-t0]/1000;
结果:
5 {8 x. r8 p. S' x: t. K) g24002271.69189384 Q7 Q( R. v& w6 U. B3 e# L: ]( N
1.625: N n# I7 i$ O( t* }- n" _
* }6 q# F7 `; C0 f' |! o8 d
matlab效率已不及Forcal。' @1 F2 T( J6 o, P$ T( j
) Y- N3 p: x& l) }提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|