- 在线时间
- 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 b2 m c/ B3 z+ ~+ M
* r5 E T+ t3 `/ k6 kMatlab代码:- >> clear all
* W0 N% w2 j# D: V3 x- a - a = linspace(1,1,1000);
' [+ a [2 e! ~* P3 `/ V% b - tic$ F& K& P2 C& D0 G
- for k=1:10000& g, [3 r' I& ~- [$ c
- for i=1:1000
+ G7 A4 E: s; v, l - a(i)=2;$ ?5 H$ F8 c4 Q0 \$ N& n
- end5 e# o& i- l X/ N6 }) _
- end* e$ f# Z! U5 X% b2 A' z/ f
- toc
, w, {; L* W: j8 P9 A- k\" M - ) C: f9 X# Z' }. L* Q- \! l# Z
- tic
0 u4 m3 T* Q# C% C - s=0;0 z6 s% _. l. P Q. J8 E0 O& R
- for k=1:10000
; q2 z; _5 \2 R9 V0 n6 Y. l - for i=1:1000
' h. E, G4 S, ]: z - s=s+a(i);
! {; g4 V F0 @ - end
1 |, n5 n9 R# r! P& S- p0 i: s - end
, w1 J0 { g( M7 Y$ x9 A! V - s
- B& `. T% H: B: D; X+ b' A - toc9 c( Y) j0 h! G9 y
- Elapsed time is 0.140658 seconds.
3 Z\" ], w& M) I* T1 N- Q - 9 ]5 A4 s3 E& a# B$ b' b' S4 R/ |* t
- s =0 C/ k\" v: F1 x* L\" @5 _& }* v
- 5 h2 {; U7 J. m* O2 x
- 20000000
4 h% c2 b\" n( z+ u' c L$ R1 l - , \0 V, A% i, ?! G
- Elapsed time is 0.091794 seconds.
复制代码 ============7 ~8 u0 w* n6 E U* Q, y3 A& U/ I( Q
" Q: J5 }0 q0 \$ D) o3 ?) P
Forcal代码: - !using["math","sys"];
- - j4 Y8 X d6 |# v: j% r D
- mvar:0 s\\" g- o& C( N% [# {
- main0(::a)=
- Y5 j% X4 N+ O7 j3 @( `1 c/ M
- a = linspace(1,1,1000),
- , A2 h E/ L$ p! i! @- R
- t0=clock(),
- # N2 j3 A2 |/ T2 h; ~
- k=0, while{k<10000,
- 9 n R. R0 u! q5 p! h
- i=0, while{i<1000, a(i)=2, i++},& i! i/ ?$ {/ m g3 R
- k++
- % Y5 P# z3 T k
- },) z! ^- P\\" s) ^! v q
- [clock()-t0]/1000;
- 7 M# j; S/ ~5 l, u1 _8 k; a' a- Q
- $ q9 u7 M8 Q7 s$ J# o1 [
- main1(::a)=' J+ w* f+ U. _\\" P( C
- t0=clock(), s=0,
- . C# w! B1 K1 z2 ?
- k=0, while{k<10000,
- + F9 P6 A2 |6 x0 Y# o0 A4 Z
- i=0, while{i<1000, s=s+a(i), i++},
- 2 U) a X- J+ p, |
- k++
- , b7 ~/ f7 w5 \
- },/ ^# z m8 n0 M! u% }) ]
- s;: O1 a0 i. s0 d5 x! d$ G
- [clock()-t0]/1000;
结果:3 ~/ g* r2 o% j' D5 s
15.484 //存数据所用时间,秒, Q7 k! r9 M6 i6 \: ] b* {
20000000., u0 u7 k5 _& a: D, u; t
5.531 //取数据所用时间,秒7 e/ X* \+ u0 G7 e% Z2 Z
; N% X" c% W: ?) ? G: e----------/ _; ?4 K L# C( L w, s* D) [5 k* Y/ k
# x7 ]9 P/ z* n3 U
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- C! }8 ]\\" x5 Z& ~\\" N
- mvar:
- 3 r/ A$ R: F2 K
- main0(::a)=5 {- G0 w% N3 d8 v9 ]; Q
- a = linspace(1,1,1000),2 z s9 W: S$ C% x9 y, _8 _
- t0=clock(),
- $ i* U1 I! P9 d6 i( ]
- k=0, while{k<10000,
- 2 x3 M* g6 `; @* _
- i=0, while{i<1000, A(a,i)=2, i++},2 Z$ [5 o; f, g
- k++
- # Q\\" V8 i/ {. O$ s8 f& Z
- },
- ; T1 \) N% M1 u
- [clock()-t0]/1000;
- + A- t3 H1 K1 g+ z) a
- 1 x; x5 e2 n1 A( i3 X* d- N6 i; N
- main1(::a)=/ k$ C0 Q& m) n: U: v( z D- q& S
- t0=clock(), s=0,
- ! L( V7 ?\\" l$ F& h
- k=0, while{k<10000,1 n2 _5 S- K% v5 P2 n. e. r/ u
- i=0, while{i<1000, s=s+A(a,i), i++},
- * M. F7 u/ s7 _. g' i
- k++
- , X; U0 t/ o: x+ o8 ]/ V
- },
- 0 i/ O- `( [1 R4 K6 E% u* W
- s;
- 3 m3 }; l) P8 a0 N! l
- [clock()-t0]/1000;
结果:+ m4 o( a1 c+ m, O2 u8 u# y' M
10.469' B- |9 }. \! ]/ W7 C5 S' N
20000000.# G1 E" ~& c9 |* q
3.781
9 m/ i7 G) t7 j! W
, I V: {/ q8 X3 R-------. }1 O' S h( y: o! o0 q
( s- W3 n% q- U* z在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。8 ^* l! H/ n1 e" }* H
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
: Z+ z: G' Y/ C; X4 p# m
5 f; _5 p) A3 `' {$ m9 _4 N' }6 k5 ^' Jmatlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。/ I: X1 v# l' J5 ?8 X+ V f( e
* u6 A& }5 q& H' d
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
: l& H( Z/ g; _; [8 X- Q0 w$ f: h* y2 |% }3 g9 W, x7 @# Y4 j
5、在循环中加点东西& I4 o& J4 P% P7 R; {: C
0 ]9 ]5 X/ I; P6 N- {/ V6 a1 I
matlab代码:- >> clear all
/ [+ B# G' |+ c- y$ p - f=@(x)x+1;; Y5 x8 n' X+ j/ C$ U X
- a = linspace(2,2,1000);) I# i+ C& R9 p! d0 b4 S8 s\" J: b& m
- tic9 W# D7 l Y H8 |& l; r% y+ f
- s=0;
, k6 y4 f8 F' _4 z' u - for k=1:1000, T8 F! F4 O9 }' Y$ w
- for i=1:1000 m3 J- k; A1 k- x$ N
- 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));
+ g1 g. ~& w% o! O3 x8 o - end
/ t\" `2 F/ j( j8 v5 S7 v - end
) d0 G\" {3 e# y4 J - s3 U9 a! D( i5 s4 P7 ~! J7 X
- toc1 U' S! p F% k2 ^8 y' D
- 6 X, D. T2 z* }3 d8 k u\" [
- s =$ Q! v( V+ ?* m3 L# m
- 4 R! w) h3 P0 k, b3 n; U; S* H! z8 K
- 2.4002e+007
8 p1 D' p. @* O7 [- P: J( A - 8 Z) ^: [7 y7 h: C
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"]; u6 U) f6 o% S# b3 ?
- mvar:. W8 H5 L+ t& ?* a
- f(x)=x+1;1 d/ W! p1 t. l, ?2 n3 k x4 u
- main0(::a)=5 X8 `2 I% u6 m8 ], Z5 u3 i6 L$ Q
- a = linspace(2,2,1000),. c( e/ B5 `5 p1 ^* ?
- t0=clock(), s=0,1 o$ u: i1 F! _' k$ h
- k=0, while{k<1000,
- 9 t, f2 J+ A2 ?; Q D# P
- 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++},
- - o9 h\\" @2 D/ B' X0 g( Q
- k++
- / D- j2 L! I8 I4 P3 Y( J7 b
- },2 q/ n% v3 b$ {( c, v3 q. q8 `- H' l# |
- s;7 Q% `. Z1 j! T4 C( |0 B
- [clock()-t0]/1000;
结果:/ `- u( I: \5 V& j0 \( E( x$ j7 X
24002271.69189384
% [# B, Q* ?# G# G+ ~/ y5.172
. A" x! y: P" `# [: |) ?' s4 x2 }# P; S1 B2 q4 Z# m
二者效率现在只有一倍差距。: s2 f; d7 p" v2 f9 G' i5 E
' P6 O u2 ^) @ w3 l----------
6 F7 r6 O, G8 z9 s* G, x
9 m/ M% o5 ]7 ?1 z" o! S不过,显然matlab和Forcal的程序应该这样写:
; a+ \2 C' J0 u2 }9 q* }; H: i' l' D- V' y
matlab程序:- clear all
% u: H P0 g5 m* w3 f5 x5 x* F9 a. b - f=@(x)x+1;
4 ?, U7 ]& t$ X3 T - a = linspace(2,2,1000);- c+ ?# K\" D! r
- tic0 d! R' D- \$ c1 \
- s=0;% S# W4 ?* E1 K\" m/ W$ \7 Q4 ~\" V
- for k=1:1000
% Z) o4 A7 J% }. P5 a3 _$ d$ r5 p - for i=1:1000
6 D% q w2 T# u6 f. K, I - t=a(i);7 d; l3 E6 z: J9 ]& K& P, P. 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);
/ m9 I* g: O, F3 D: C X6 ~! x - end
- u; P# X) x/ _5 O2 A4 l - end* }2 n; [3 x' m, d* n
- s
7 m; b3 U+ |5 ^) X; C - toc2 R p% l, Z# m& |5 T7 I0 o
- # ^, f- Q8 V+ F
- s =/ u1 r% |$ y' c! l2 ~: X
) Y5 `* p6 G n- 2.4002e+0074 j' E! v1 P X ?
6 Z% m. }7 L4 D0 q# y5 x. O1 f a- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- 1 Q( N: Q) ~6 m \% u' Y
- mvar:
- # Z& a\\" Z; `6 n/ u* c# l: I, ?
- f(x)=x+1;6 N! G, i$ ]3 U! ~
- main0(::a)=
- 7 w; j: p6 i8 ^% n) E: E
- a = linspace(2,2,1000),
- - D+ ^: k4 c7 v3 j! ~; Z v* [
- t0=clock(), s=0, M3 r# e- n7 U: Q' C2 ]* ?/ P+ S
- k=0, while{k<1000,
- ( z% V! b) k C\\" E2 n
- 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++},
- 4 t8 G! M0 A; ^
- k++
- ) I- s) N' a+ K/ \1 I- o
- },
- - p\\" A8 p& n, d( O2 `
- s;
- , [$ Y$ G, W \4 ~0 f
- [clock()-t0]/1000;
结果:
4 ~$ {1 \9 X& y/ R5 \24002271.691893849 h( Y2 ?; d1 k
1.625
0 r# E* H# J- }9 K7 M' [
% l. h" p; h8 A Umatlab效率已不及Forcal。
7 C# [/ N' u5 V+ y, C; P* z1 B6 E" y. x4 o
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|