- 在线时间
- 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的数组存取效率非常高1 n+ K2 Y) A8 } P
- Y0 h( A' M4 L9 a
Matlab代码:- >> clear all
' A v5 Q, n\" Z2 P* J - a = linspace(1,1,1000);
% W' X' B1 t h! Q9 r& B) k; _; k1 F3 _ - tic6 p: r2 b& O4 l( j: |
- for k=1:10000% Y6 c4 [8 X# n/ y0 b
- for i=1:10002 v: Y% G z6 W) Z4 y0 ?
- a(i)=2;) w, L; I1 F/ x
- end
6 i; y% _( r: z+ V! P+ z0 D - end# z8 K\" B( l# w8 h {8 R' Z
- toc
& r+ q# t5 T: a/ ?: e. H: X8 b - % ?3 U) k) W) {( u$ p* W L: L% d
- tic* X7 v. W; G- _6 B) a
- s=0;
4 B\" k) Y: H5 f0 }' u - for k=1:100001 h0 d) C1 ?. L. q/ s( O' A
- for i=1:1000
# k9 g2 @\" W/ `+ K5 _ - s=s+a(i);/ X6 g( O: s! u h! c9 f0 V2 u
- end+ T; r4 C$ P7 p0 ^. W
- end4 n. w) E' G- ^1 }( ?9 L! m
- s6 T5 k7 ~6 s# f1 j( g z
- toc
: U! C9 |0 o% k; N M5 z - Elapsed time is 0.140658 seconds.
- W2 C8 G4 P& X. `/ t- @ - i! j( I$ |2 y8 o3 L1 N
- s =
3 M: y* X6 l* {2 f3 ^
) d. X1 S\" w! U\" X+ r- 200000000 o) C+ N# X3 D$ I
- 9 O% V# h& X; w3 i: H
- Elapsed time is 0.091794 seconds.
复制代码 ============( {3 \% k1 F0 N2 C$ N) i
/ ~0 f( N& R2 N+ z& cForcal代码: - !using["math","sys"];: E5 N9 n; e1 j& E' w4 ^
- mvar:
- , g( y; M/ ]! q# P7 w& E2 K
- main0(::a)=
- - a5 ~& E$ J1 N. i. i( v# f
- a = linspace(1,1,1000),
- + u' U' X2 k\\" P! \, d1 ?
- t0=clock(),
- 4 k8 }( h; J1 s7 D# i
- k=0, while{k<10000,+ k+ I* Q+ ?/ H# v
- i=0, while{i<1000, a(i)=2, i++},5 M- ~& l$ i3 D1 q\\" _
- k++
- 8 x* U. {5 ^' X9 z- s. N
- },
- / \' s+ |3 s+ F+ g/ B0 y% i% i
- [clock()-t0]/1000;
- - ]; N0 H4 [2 H7 X7 {; L% L
- , G u; i z4 z/ ~
- main1(::a)=
- 6 w$ z$ n) a+ K1 Z
- t0=clock(), s=0,# G, l4 W; U- ]( N
- k=0, while{k<10000,
- 6 Y! @- L# C4 b$ r0 b8 a
- i=0, while{i<1000, s=s+a(i), i++},
- . l9 t! h# G+ w- x) C$ h# x; e9 J
- k++
- ) a( P( g9 F# a/ X; o2 A2 w. h6 [: V
- },
- 5 y& `8 j8 Q' n7 E/ T
- s;$ c4 b' Y3 l; h1 } A% N+ N
- [clock()-t0]/1000;
结果:; z% U3 ^7 r4 @8 z3 A
15.484 //存数据所用时间,秒" y* Q0 O# {4 j% L1 u+ g7 a) C
20000000.
2 W3 r( G4 r( r% L$ r6 ~+ @+ ~5.531 //取数据所用时间,秒: M2 U1 V! w5 Q: Y
" S" x" S2 L8 q# F, W! y----------
/ h/ d( r2 p1 r( g$ ?$ v; }8 n+ A% P3 V3 D! j% J3 L( X# g
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];# [( S, _; t& v- ~8 W
- mvar:7 C6 @- i+ M! p\\" A- b/ y0 F
- main0(::a)=
- 4 }3 h\\" ~% u( z, Q* u6 a
- a = linspace(1,1,1000),
- : E( O! C2 h\\" k& H5 Y, }
- t0=clock(),
- - C u( O8 o6 b
- k=0, while{k<10000,3 y2 \* u7 h* p2 a. b9 K\\" T L8 T
- i=0, while{i<1000, A(a,i)=2, i++}, M% f7 u: v& W0 [6 O, g) L- n
- k++$ q3 ]1 `3 \( y+ A
- },
- # N; @$ H9 J8 [
- [clock()-t0]/1000;* v3 ]0 P2 H+ l: b/ @: c
- 2 s& L+ w2 o! \# `) f( F
- main1(::a)=7 F, N2 r! i2 o' l6 q7 p
- t0=clock(), s=0,
- 4 X! j: a- \& J' \
- k=0, while{k<10000,
- ( `. z: C3 {) c
- i=0, while{i<1000, s=s+A(a,i), i++},! g9 }- J% X) P9 Z5 D
- k++
- 8 w( I( u: g3 m
- },
- * s# ?\\" ]5 g2 ^3 {
- s;
- * V7 v' c: g0 u1 ~% |
- [clock()-t0]/1000;
结果:6 D e: Q* z5 S8 C) W. O% q
10.4699 U" Y) \! }' k6 O
20000000.- d) Q& j; B! t: x& n% q8 e
3.781" a/ g, b7 S0 g3 ]
6 r- T, T) B* [
-------7 H" f, r8 \, W. [* H! f
: w3 P2 o6 r0 Z* B
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
* C8 e/ m8 _* N& m在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。0 [( u' H0 Y, O0 x- Q; S# Y$ m' ]
4 M1 K' p1 I8 @. E+ W% x3 n) `
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。8 o+ W$ ~0 l+ ?8 G
) V3 l4 A3 V/ Y! g% J9 u$ R- o' D
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
' c2 z% \3 a6 t+ ~9 e8 k' w) M& N+ r5 y: C
5、在循环中加点东西) H) U6 R8 B9 f. [7 Z7 T* |- a$ p
0 _; z: w) e' ?( d
matlab代码:- >> clear all3 n8 x# B* [* y7 t
- f=@(x)x+1;
: ~$ J# V0 u8 M; @0 N0 Q1 M - a = linspace(2,2,1000);; ^) ~- h E2 ~\" Z- R6 C\" S( _% Q
- tic. j2 b\" C7 E# ]' ]
- s=0;3 U6 o- b. i4 W# H
- for k=1:1000: d$ O0 Q6 N\" |\" Q, Q0 g0 V& p+ q
- for i=1:1000
, m& H* u1 T# ? - 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));
/ q, Y4 z4 z+ f. |5 Q7 ^ - end; Z: g: ?2 l z* ]\" S
- end
- H7 e7 V) u. ^ |; T% A9 K - s
l* z3 s1 ]\" P - toc q# Z% i4 E N- n) Z% H
- # W: M% h1 O. m( [8 f
- s =. c g2 M: m) \' j
6 B+ F7 b; J* f- 2.4002e+007
) c0 M- ~! k+ R0 k3 N& B9 \ - . ^\" z* n: n% Y% ]9 R6 G# n# O
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];3 |2 j\\" W- D9 X7 j, i+ B
- mvar:) c6 n# @7 M/ Y) v( A! C
- f(x)=x+1;
- + | \\\" ?. G& T7 ?5 r E2 e
- main0(::a)=
- - {6 M% W, u- z- T\\" y
- a = linspace(2,2,1000),: }, @! Q. ]' a5 E. T( w2 i# t( O6 m
- t0=clock(), s=0,
- 9 M* l* z2 e0 ~% o& ?: m7 g
- k=0, while{k<1000,& \ @7 {6 m& |4 B6 o) U4 T
- 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++},
- ! F+ M- B5 O0 {! F* k8 G: J
- k++
- , s+ m1 @6 t: b* \% m. P7 u J
- },
- ) d\\" P6 H2 a+ o c! C0 R
- s;
- % a8 n# c k) B6 ]0 y o5 @
- [clock()-t0]/1000;
结果:' C' h+ {; a3 V% `! Z: `
24002271.691893844 x5 H) k5 u4 Z. K( P7 B
5.1722 \/ `' f! g E% {
$ f! l5 ]# U: }: y二者效率现在只有一倍差距。
, L( R; n+ k4 R9 o+ \" N
3 }# z; m7 H0 \( u& l----------
- T( Y' G' f8 o8 f6 [+ ], I
. ^* r5 n2 Q$ l& P9 x不过,显然matlab和Forcal的程序应该这样写:6 [4 G; K7 [ }; E
& m$ V% f2 M; Xmatlab程序:- clear all
2 v' i3 I' W7 W$ f& ~6 A3 P. u - f=@(x)x+1;! I, O. E4 N8 Q9 N, n6 Q# [
- a = linspace(2,2,1000);
3 Z; y. m# n/ Q\" W. g$ |8 J# C) ~4 y - tic
0 i0 `\" H; s; S5 x& \- Y - s=0;
3 Y5 O4 n7 B U i - for k=1:1000
& E9 W1 {9 @# i# ]\" S5 p - for i=1:1000
) \( R9 E7 F6 ~( g/ o: c9 y/ @ - t=a(i);; P\" }* s3 d\" f) S\" N/ 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);
3 j8 f\" k/ U5 b. b' m) s: ]/ x. x - end
8 c( \! \9 q) N$ j - end8 i w+ X\" t* G8 y9 \& M! b, `2 S' M8 T
- s
( k1 n; B* ~6 v9 `' h$ q0 g - toc A4 X. l) w, ]
\" B7 g9 }7 o2 m( U- s =* k. `6 L6 b, X. p8 {
- _5 G( K8 G& j8 J- 2.4002e+007
( B' D. ?8 Y7 u' T* b3 S/ v8 }$ B - * N\" n# d9 X4 Y4 ]\" H
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- - v$ v; N1 p9 M% O6 y( H
- mvar:4 Z\\" }+ F( p4 X$ ^' R
- f(x)=x+1;
- * ]9 `8 c+ H7 T; N
- main0(::a)=, q8 C4 L+ j- Z\\" [' U, V6 r! M
- a = linspace(2,2,1000),6 Q; G {( o7 b1 P. H: ]0 N! O
- t0=clock(), s=0,+ k* M\\" r$ i3 e8 X! a; V$ i/ P
- k=0, while{k<1000,
- 2 a% x/ H/ `) Y: {. G9 K
- 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++},8 n( Z G' A& a0 _
- k++: c. }2 q V% { E/ G
- },! m( J( V6 l0 ~' Y# K, E C# |
- s;
- 2 L7 R, o: r: G( e0 S4 m4 Z
- [clock()-t0]/1000;
结果:
8 ~$ s, b! P9 W. I1 M* N24002271.69189384* k& p; C2 _- m4 i) \7 W1 q
1.625( Z* V$ v6 i! L! Q$ L: W- O5 S
! o7 g( F" ~- g- A. K1 L3 a( W! v
matlab效率已不及Forcal。$ j" w0 V5 i$ c. P( E9 x
- n/ @8 @- y( ^8 L4 X
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|