- 在线时间
- 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的数组存取效率非常高
4 ?! z4 U8 p( W, z" X3 |' v: [+ P' o t3 m
Matlab代码:- >> clear all
/ Z. K* V& M8 _9 S4 ^ - a = linspace(1,1,1000);, O- {% ]\" U\" A0 q) s
- tic! _8 s4 W6 X L( Q% T
- for k=1:10000+ M# P\" ~- z: E. j7 ? x$ k
- for i=1:1000
3 \- B& H* [: O( \8 S7 P$ V) C4 a- d - a(i)=2;
7 ~9 k! `/ @5 g& Z\" M7 ?/ \\" @* P+ ] - end- d# v+ y2 v9 }8 u; p- W
- end( W/ p* |\" U9 `& U V
- toc* P$ K# F; `4 h* |
+ \+ W\" c\" T7 ^- tic
! R$ v$ ^: J; ?5 I# X4 ^ y& u - s=0;! Z+ t2 a* p; t/ E0 K' n% J p
- for k=1:10000
X3 {6 q8 E5 {- s. a - for i=1:10001 b( P( z) v- [+ e
- s=s+a(i);
1 f8 M4 U4 Y6 {3 J9 q - end' P1 \) I7 r: K
- end( i) ]4 \\" f5 ?2 h, C
- s
6 ^0 o! j3 H7 L' M - toc
' v$ K* T' Q' E! P* Y- T - Elapsed time is 0.140658 seconds.4 A; n. I* P! r8 P. m# S
7 L; H4 h4 N# G7 X5 p& ^6 f7 I6 x( B- s = q$ R) n0 a* C! E\" C
4 d: [5 e/ G# X1 J- 200000005 Q! W2 P; s; a- k: }
% C# u9 |( r3 X; _, K) p- Elapsed time is 0.091794 seconds.
复制代码 ============4 r3 s8 L+ ^5 e9 x( y+ o
. t* g4 K; |! z2 Z, OForcal代码: - !using["math","sys"];
- ; V) [. }3 @; H7 r& f) h9 x\\" y
- mvar:$ m7 [8 x4 p7 ^
- main0(::a)=
- . r7 R! C2 w: D2 ^
- a = linspace(1,1,1000),: `+ g0 }; x; Z5 Q3 ?+ @1 x6 v
- t0=clock(),
- . y\\" T5 y# P! u0 E0 u2 r
- k=0, while{k<10000,
- 9 R! X. t1 R8 E4 k7 |) G- G) r7 b, V
- i=0, while{i<1000, a(i)=2, i++},
- 7 g; `+ J. Z5 J Q: y& v
- k++3 R- V\\" k2 U1 X: k, c- s
- },
- & }' F3 r' p3 a4 H) z3 c
- [clock()-t0]/1000;7 j. @: S+ n$ }8 a+ C
- 0 Q! \8 N\\" [- ~ Y4 @7 {2 o
- main1(::a)=
- ' a8 y. ~' B* s! z0 k
- t0=clock(), s=0,
- $ G ^; c* J. l
- k=0, while{k<10000,! H% E( y- a, j9 ?( V( _/ |
- i=0, while{i<1000, s=s+a(i), i++},9 z, q! R- i$ e7 r$ W5 h3 G
- k++8 n7 ^\\" [) ]. Z7 J7 q* k
- },5 I. k3 z3 f1 X4 y
- s;
- \\" r% u. H/ Y6 n) m\\" }, i
- [clock()-t0]/1000;
结果:2 O9 [" P$ @ P% M3 }5 A
15.484 //存数据所用时间,秒/ D" m/ k9 j) _4 G* p$ \* \& J
20000000.3 X8 c! `3 r* B: b4 j* V* x4 ^9 K' i
5.531 //取数据所用时间,秒
. M Z7 Q3 r1 d" t: [+ }2 O8 `& a& z& `! A, P6 s3 u3 j6 W
----------6 A, C+ Y) ` s
; B5 @; t# H/ y& p+ k
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];. E. X3 A- M# O: X9 Q L. K
- mvar:
- * T( t! @2 C6 F8 |( a: C
- main0(::a)=) Y3 F/ h `. i: f) {
- a = linspace(1,1,1000),- |) l\\" w6 U l& i' q# _\\" Y! n0 v8 T
- t0=clock(),
- : Z5 B6 ~2 k. @$ a7 Z2 g
- k=0, while{k<10000,
- 2 l, C2 [9 L P; _6 s
- i=0, while{i<1000, A(a,i)=2, i++},
- + t- s2 a* N$ c& g& {) Y7 J* n
- k++
- ( D( Q+ o! T1 Z# o z
- },
- & P6 a% y/ Z9 h8 M' s8 G- |
- [clock()-t0]/1000;3 D4 W3 O6 r9 ?
- 3 p4 k; E3 J B& c
- main1(::a)=
- 9 \; r; y( |# O& Q9 `
- t0=clock(), s=0,2 k8 o6 X/ n\\" y: ^* {. U' c) j
- k=0, while{k<10000, P# a ~0 n4 z& t2 ^' s
- i=0, while{i<1000, s=s+A(a,i), i++},' b3 m, z( D. i+ l! P
- k++7 A. u1 r- l. Z
- },
- ' |1 T2 [$ `8 d5 ^8 j* \# E* T
- s;
- % Q\\" l, B6 B, n. L+ o0 p, q
- [clock()-t0]/1000;
结果:) W4 S+ B. `! G! O
10.469
# d1 j+ M e2 ~20000000.) r% }+ ]+ ?% T; H
3.7814 b3 w) H" K2 T9 P! ?
- z( z9 M. a9 ~* K. k-------2 c9 _; @: _, |+ A
2 d% F. _5 `- k' Z' s5 J( V9 `
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。1 T9 M# w- P. h/ Z/ M, u
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。# H3 I1 O$ B7 z- d9 F- c) h" o9 z" o
4 m7 V" c/ x' W
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。" X1 A) K* j2 Q k# B; M; R
; P2 L8 o$ p& eForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
- { g% s# _: ~& \/ k. t/ S9 c4 s) y
5、在循环中加点东西
9 }# ?; H- w' s6 l! X# Q5 c/ O' s9 E2 w; ^. C
matlab代码:- >> clear all
2 V2 H. Z; I* l- u - f=@(x)x+1;
6 a% P+ L- b; U# } - a = linspace(2,2,1000);\" X5 b5 c/ B, @6 `. M
- tic
h% Q/ s% e( d - s=0;: `8 t; B: l( `5 B+ D9 g7 ^7 z- I
- for k=1:1000. V: M- h1 S& ]4 n\" d
- for i=1:1000* z9 U* O5 B2 J' T/ M\" A/ j
- 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));
% \* n& i( _9 n9 ?0 ^ - end: y% H [4 q$ `' b4 r9 z
- end# P5 I\" o% W. m e3 E! g1 E
- s! K( ~ x+ F- W) i) U
- toc
& v5 {' V1 k6 K - 1 Y3 m/ \; _' y6 u2 x5 ]4 k+ U* j+ n0 @
- s =, z$ L, s2 l% C
- ( u8 \1 S& H; x
- 2.4002e+007
T' Z* l0 s$ S9 K7 u: i
+ @% D9 j1 Y4 _3 \' J4 b- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];
- 7 W# R: M! g- I- i
- mvar:
- 2 `9 H\\" f5 j [: ?0 r! G g: U
- f(x)=x+1;
- 5 N& f5 ^+ J5 e( m& T, W- l
- main0(::a)=; ^( T0 Y4 K) C; R7 ?* c8 v5 R
- a = linspace(2,2,1000),. Y: c/ k! M& ^) V$ g
- t0=clock(), s=0,
- 0 j5 f' W5 s% u\\" }7 j! m& o
- k=0, while{k<1000,
- r) q* P% T0 q3 K
- 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 c0 R. E, T/ E2 y1 ~7 e. [) g
- k++
- 1 |3 O8 O: e( b3 Y
- },
- 2 I4 c; l( K7 O* a1 R: @) L\\" \
- s;
- ( w; a: i! P; ^
- [clock()-t0]/1000;
结果:
- r) E$ I; e1 e& G$ S6 b% z24002271.69189384
3 H3 y7 B4 F& B5.172
1 w* U* X: g* W C
( B* _' H+ Q: q ?二者效率现在只有一倍差距。- `6 Q, y) j: @) O" n/ w5 K0 J; b. V
; q7 t) {$ y6 ]
----------
) b* ` A7 X/ J0 _( c1 [. c" X
* U U% E' f! H, t不过,显然matlab和Forcal的程序应该这样写:
/ H! l9 {# u; }4 s" D. G1 @: H, r: L+ X% s: `
matlab程序:- clear all
; ^, C0 U+ M/ z0 e1 S - f=@(x)x+1;9 c5 T: }1 O% r8 G
- a = linspace(2,2,1000);
; A' V2 j5 ?7 b/ _& @5 `! S - tic
. ^# e3 d& o+ x* ^! \( C( L: N - s=0;
+ y% k, W/ b0 s% |. q' F, I( z - for k=1:1000' @0 v7 s) |% O: S% }6 x9 X
- for i=1:1000\" b: K+ q. S- ~\" N2 B( B g
- t=a(i);
& b* P5 V# m7 h/ B( Y x5 X; 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);
/ j( J e( G/ ~# i9 I7 K - end# L+ y2 {6 F2 w
- end
7 p4 w9 m& V: K1 L - s# L2 o5 D9 {* {+ m/ e
- toc/ W4 A- I% j4 I0 O& K/ Z
- % c8 Y9 o9 y& G* K+ T; g- h
- s =, p& q/ V! A7 ]5 E7 i! n! ~! N
- ( [+ ^& L; L( \# a( l' h7 r- q
- 2.4002e+007
; ]% z; O) {' \- ` T/ b6 a - \" A( b8 z; I% v8 w$ X' T
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];. s1 C6 p\\" |/ v+ n9 j
- mvar:
- - A9 c8 w3 P2 Q6 @ K6 Q3 {
- f(x)=x+1;
- ; t& p\\" B& l4 q f' E2 I
- main0(::a)=\\" H' m2 J. R$ j; S! w
- a = linspace(2,2,1000),
- ! ^6 B, D. a, r
- t0=clock(), s=0,
- 8 i1 B& F* g+ |\\" S0 D) @
- k=0, while{k<1000,
- ; [; ?1 {& J/ l$ K. v
- 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++},% r2 N2 C0 q+ {4 J8 t1 [: n y
- k++4 {! J: u9 B4 h4 F: g2 s
- },# w R& e, p! M, N6 {7 L
- s;
- ( E( @7 O+ o8 u3 ~7 D/ G
- [clock()-t0]/1000;
结果:
3 w# Y6 v" j+ k8 m; A& h/ j! r: A24002271.69189384- s2 x4 C; |6 [2 _( ?3 E4 k9 g% u ]
1.6252 w+ I; V' v$ u3 s4 j
7 |" D3 J- u% M
matlab效率已不及Forcal。
$ h$ _& {% r- X& N/ l/ P( I( b
2 R! ^6 M( `% g- Y7 d" g: w提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|