- 在线时间
- 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的数组存取效率非常高
! T; x* D7 |1 d& ?( f: ?& t
/ a( ~- J- [# T: t9 F# e2 B7 OMatlab代码:- >> clear all+ x: _; q% I( m; B- n+ b7 b$ O' u
- a = linspace(1,1,1000);
9 q2 W2 V% E* W - tic
L- x- f: i( q0 F - for k=1:10000
3 d3 ^6 E `8 L# w& a - for i=1:10003 B9 ]/ `1 y) q, c# l# V
- a(i)=2;
7 \: g4 ^! M9 N! x \. c - end5 o' J, A6 n1 z5 a+ y
- end
; q+ m$ B5 c$ J+ f' v - toc3 s v4 c0 E+ T) s* Q# ]
- ( P\" g6 B6 H( m7 }6 Y/ G b9 ]
- tic3 m& _7 y* _, _+ y' n, C
- s=0;
|! }: M' c4 k\" F8 {/ G - for k=1:10000
1 V( `6 F4 C. R% c+ Y! t' D. w - for i=1:10008 [: o3 T7 }% n5 s- D9 |4 ~ d
- s=s+a(i);/ s2 T& y\" B$ n9 r& N' a) `; M
- end
3 q2 l7 M: [2 z, Y - end
! R% Z, y8 }% T+ J7 ?( G* o/ B - s8 i2 V) @4 S; g! u+ ~$ N( }\" i+ \
- toc' ], Z! P& t+ g# }. `+ ]. M
- Elapsed time is 0.140658 seconds.
2 F) H\" t% k+ `\" d7 U - + A9 N7 Y! D+ X
- s =
* o% u2 c, |( X* z - \" z, J8 y* C$ s9 F3 w0 ]
- 200000000 L) d5 ]3 h, z( l$ j
- , ], g) x# ]- q& w\" j6 u G
- Elapsed time is 0.091794 seconds.
复制代码 ============) D6 f$ l* }( a& L+ Q' F V
! I' Z$ N$ M( t2 e3 r8 aForcal代码: - !using["math","sys"];
- 5 I* j+ l4 S# V: {
- mvar:
- 8 o5 l8 ~- W/ Q- n+ [. Y% l* @' X
- main0(::a)=
- . O: u, C/ x4 @; i
- a = linspace(1,1,1000),) e2 R* y# J6 ~\\" e8 b8 R1 F2 ?
- t0=clock(),\\" C; b' s% g, G( m/ Q# o
- k=0, while{k<10000,( d8 j9 ~- t3 k$ a
- i=0, while{i<1000, a(i)=2, i++},) u. v6 v+ A5 T0 Y
- k++
- ( j\\" @4 u* c& W7 a9 z2 Z3 b
- },
- % G, q/ B* d3 T8 {
- [clock()-t0]/1000;0 o# y) o+ Q1 C% N
- 3 ]# Z/ z4 v% q, `- w& r
- main1(::a)=
- ( @5 ?9 T3 w1 m. X/ y9 b, ]+ g
- t0=clock(), s=0,
- & V+ }2 b; F7 E, [6 C8 F
- k=0, while{k<10000,7 Q+ x( D! Z1 b8 \0 M* k
- i=0, while{i<1000, s=s+a(i), i++},\\" a& @: V/ U5 Q& U* ~9 o6 E p- [# u
- k++
- ( Y6 d. W; {9 S8 L: T, y4 S7 {5 B
- },
- 1 S) t6 w$ S2 ^+ W2 p
- s;
- 2 j+ H/ Y/ D& N8 ~& }) E- j\\" T1 _: T
- [clock()-t0]/1000;
结果:
& f# S o# n" e15.484 //存数据所用时间,秒. ~( ^. B, C x2 W( P+ O
20000000.
) _7 Q L1 ~7 s" n- M; i5.531 //取数据所用时间,秒9 h1 L2 g% F$ v) D& y
0 t5 c* a* I$ b- o. _" x$ o----------
9 R, ]$ r) ^! Y) O0 [5 N3 C* g1 V" H7 E; D
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];; u9 f+ \\\" f# n6 t9 B\\" ^5 z
- mvar:
- 0 e. Y3 `- m) @ a
- main0(::a)=
- ) ?5 h. R9 b# B: B% t/ {+ Y
- a = linspace(1,1,1000),8 P' G/ J9 B# I+ S/ Z# A( k
- t0=clock(),3 R3 Q3 o5 G( E+ k. S# k/ O9 @\\" i
- k=0, while{k<10000,
- 4 }3 S! l$ F3 f T
- i=0, while{i<1000, A(a,i)=2, i++},+ a7 L3 i% i# h1 C' r( I
- k++; A5 n5 o H6 L) E: `# w
- },
- * c; V; Y) J0 }: c
- [clock()-t0]/1000;
- * }, {. H6 _8 J& ^! ]
- * p% V2 i% R8 [( Z; m. ]
- main1(::a)= C0 |3 Y7 n. [) I
- t0=clock(), s=0,* G% G9 v% `( A# j3 T
- k=0, while{k<10000,7 v! |& {' q1 ?
- i=0, while{i<1000, s=s+A(a,i), i++},& ?5 b; v: i, e- e
- k++) k1 @4 f# G5 {; c2 @& ^
- },, u- @* P! g% b+ B2 D
- s;
- 6 S' j( X' P* `: ^2 G2 n. Y
- [clock()-t0]/1000;
结果:
- ?5 ]; B l- ?# r( z10.4698 M5 N- r1 ?- ?
20000000.
8 q" I& q0 @5 ?8 U" n3.7811 b4 h# w) G* h8 a2 L
7 E1 C# c& K6 {( ~% ~8 _-------. _1 E9 Q: R8 _" J) M& E$ i( [
l2 X! Z1 I7 H* q在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
# n ]. x% i. S在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。8 S" L* }+ d+ C! \5 N6 x" z
9 E3 k+ @) u0 ^6 a! k2 i; Mmatlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。6 o* @3 U9 e: u2 h: v
+ }. z8 M! @& h/ m; f2 e, m
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
1 ]2 p7 ^3 Z5 `% {7 r& h. Q
9 @# @( U2 i5 `$ T, v5 ^* c5、在循环中加点东西3 k2 L$ ?) Y% w6 e# _' \, O
- L/ P5 M7 q8 U$ C+ M
matlab代码:- >> clear all
# J\" q: z) t7 S$ I7 ?! l - f=@(x)x+1;/ T+ j\" c) t\" F* w1 Q
- a = linspace(2,2,1000);8 D1 l! b$ \7 {1 u- t8 ~3 z4 k
- tic
4 T0 y l* W4 ?* p! m - s=0;, t# v/ d9 ]5 x! f6 W
- for k=1:1000. w5 `7 D* t5 S, d
- for i=1:1000
, |7 l* |: T1 p: g - 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));
# `8 c+ U\" ^/ [5 Y6 S' ^ - end
! \: d: ~\" R6 F4 T$ b - end6 @# M3 `% d. A0 m( }' R
- s
/ o7 y3 k1 B# D% p, q0 b - toc
' e: n. M& _2 B6 y3 J0 a( T n
3 b4 ]0 W+ s3 k% x8 T/ l( P$ z- s =% F- t' j% ~8 W- U. P) ^. g
- / h% h$ ~5 x0 v3 M
- 2.4002e+007
/ u! j+ L: P4 ?; C. i/ o6 e$ ~ - & ~, z3 L; W! ~8 U+ c, S. w& {
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];% ?/ {$ v B8 J# g* s! r. Z8 T: u b5 Z
- mvar:
- 4 A' `0 M1 }4 E0 H5 W3 ~
- f(x)=x+1;
- # V- {, j; c4 k0 @/ B* c. J t
- main0(::a)=
- * g: b: \5 _0 ]0 C0 `
- a = linspace(2,2,1000),
- $ ?3 T$ Y3 x1 ?) e
- t0=clock(), s=0,
- / c5 c' n8 ^7 i- M
- k=0, while{k<1000,
- % T# }4 Y7 K5 V9 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++},
- @% o( u' G# A/ H\\" z- H1 J
- k++
- - I/ e, ?+ P- [8 g: S
- },
- . {! r- B U' q! \; G% f
- s;
- # L4 T; k: V' e% Q( n
- [clock()-t0]/1000;
结果:8 M3 p2 r- g( S. c6 ?& g
24002271.691893848 e5 T/ X" ?" b+ n; b) {! P2 A! h
5.172
2 W) q$ w: L/ y7 a2 ]! u) \! b |9 }! f. l T
二者效率现在只有一倍差距。& ^$ q M" u4 m. i# Q
8 ~6 g e7 s6 c! }: _----------
: E) Y3 [6 i! B( x6 D: p9 k& E& }! i" Y, m4 r
不过,显然matlab和Forcal的程序应该这样写:. C( X# D2 ^/ j1 u e; e, c
1 g( Z6 R [8 i9 U) n7 w
matlab程序:- clear all/ J9 G$ s$ O* S6 u/ Z8 p
- f=@(x)x+1;
+ ?3 d. s# E* n - a = linspace(2,2,1000);\" S& L$ u' r s; e\" w1 t
- tic l' }: v9 `: L' J3 P
- s=0;
\" _ T2 g: e! t3 x - for k=1:1000
( ]' {- Z3 k# C8 m6 n1 a4 A, ^ - for i=1:10000 _; L) S4 l9 O t5 j
- t=a(i);
2 Z, r( B. U! V( c: f* ?: u2 B! N - 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);
) B1 X, L0 o7 w ^ - end+ e5 i2 \( e\" y9 J
- end
/ b& E# `) j0 W/ f# Y, b. g4 w - s
: u7 _' Z1 Q) M: O - toc
/ w\" Y8 _\" P# \/ i) G
% }6 `! L* @ _6 ?- s =
\" i9 ~% r `\" ]8 X9 e& I( d N+ x
! l& D( @# k3 G' f8 P: \' b- 2.4002e+007: b9 U: n/ c5 P3 z. o3 K6 @) Q4 E
1 S; P$ Q& p. W5 s3 }- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];3 u5 |% K\\" X: h& v- v3 t. x
- mvar:
- + m0 R\\" N1 K' y
- f(x)=x+1;
- : W/ A0 Q$ t\\" G0 o
- main0(::a)=5 r: b4 K2 |) ?
- a = linspace(2,2,1000),
- % i; J8 ^; I5 @: U9 [8 E& R4 A
- t0=clock(), s=0, `3 `$ i9 Z5 Q* T! f
- k=0, while{k<1000,
- 2 D4 g# q; z* S k9 u+ f' g+ o O
- 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++},. l0 {9 [' S6 ]
- k++1 f; {( P# Y7 C9 d* z- P) |# y
- },+ E5 I8 }, T7 J& { F2 C0 t
- s;
- , q! Y* R1 h/ Q% m! J
- [clock()-t0]/1000;
结果:
7 s8 Y0 S# ?! F9 u5 O24002271.69189384
. g/ R) o5 u" G+ D Q1.625
( V4 o4 V6 n( `' G/ @7 ^5 _ D" ^' M7 S/ \! G$ V0 y# x( p
matlab效率已不及Forcal。* F! z/ C+ o/ |& o" l, y
\ ~# a0 @2 G8 U. ?, z ~+ N) s( k; [提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|