- 在线时间
- 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的数组存取效率非常高
" F' v5 H6 u; y( K* F$ M6 `- p$ Y( d! Q- x$ W9 }- t
Matlab代码:- >> clear all2 O6 w( d' u3 v( x: C
- a = linspace(1,1,1000);* M* k9 U9 t- J
- tic
% D1 p0 M) k& i# \2 F; { - for k=1:10000
3 {) C; m) u) P/ y5 A& V1 u' }7 s) F - for i=1:10000 u1 J# s# e! L1 _
- a(i)=2;% ]& f f6 {' U1 y5 |7 ~. ]3 p
- end/ ]4 l6 O: z9 ~$ B n
- end7 g! \$ Q& P5 J9 C a
- toc
( M. k$ q% T6 H\" _
( A- Z) t7 Y2 \+ v9 Y' P* b- tic7 f! F2 R4 b# i j/ c5 C. Q
- s=0;* Z7 v( X6 }) F. P\" q, x
- for k=1:10000
8 s1 F, y7 V6 ] - for i=1:1000' Q$ D3 \4 L. Z# M% w' a
- s=s+a(i);
+ I8 o) V, p8 J( [6 D - end
7 A5 Y% K\" j& q2 ^6 X - end
\" b* T0 f6 [* O! {9 B8 N - s
0 C U2 i) `0 h- r( Y% f1 _! Z& _ - toc
- ^; ^6 v* M& s, Z3 m - Elapsed time is 0.140658 seconds.; B2 r- x: o. O$ @% P9 M
- * I5 P. W0 \+ U1 g
- s =
7 }\" P' T, M% T- _\" c - 2 ^. ~0 v$ }, k! t4 B! _
- 20000000
* K m8 N; A\" }3 R - , _; t7 J& i7 Q# Q+ R/ b; L
- Elapsed time is 0.091794 seconds.
复制代码 ============
7 G0 C% Q; N0 s1 \. v. q7 J
# F+ d- H$ Y1 n8 }0 \9 n* hForcal代码: - !using["math","sys"];6 L3 a# ]- d r3 y% k1 n
- mvar:
- $ @! J# s* \8 r' O( ^8 E8 I
- main0(::a)=
- , m7 ?$ F3 _9 x, o) ]1 a' a3 u
- a = linspace(1,1,1000),
- ' `. `, W0 L2 M* G( ]
- t0=clock(),6 R& z( }- E+ p0 l* R
- k=0, while{k<10000,: h. A; t7 x: i
- i=0, while{i<1000, a(i)=2, i++},
- + _) d# F6 _5 H5 D) H B7 | m) F, ^
- k++7 z6 C2 Y; ~: t }3 _2 M
- },- X P# H3 j! N
- [clock()-t0]/1000;
- % k2 E* o7 T. P! k: s9 }: Y z
- 2 v: o& j\\" w! I1 r
- main1(::a)=
- . z+ f H+ R. u8 e. u
- t0=clock(), s=0,* k J, C) l; h/ \/ |3 O
- k=0, while{k<10000,0 v1 r+ V1 W9 I. L\\" c
- i=0, while{i<1000, s=s+a(i), i++},
- ! o D5 b3 s, k2 w: O# x: @
- k++9 x. h( }9 B9 F. s/ S$ f$ z; I, W
- },
- % R9 p3 O5 ^4 c6 {) L* y; w3 N- U9 ?% e
- s;
- ' D2 J5 w; K* ~2 N+ f s
- [clock()-t0]/1000;
结果:
+ g0 L, }( r7 V2 \: A1 D. ~0 F15.484 //存数据所用时间,秒
; V) m3 s4 ?/ R( f( i% B20000000.9 x+ s$ m4 f( W8 O# l3 m7 O
5.531 //取数据所用时间,秒
5 y' U4 G' L2 R. u" `9 w& ^2 u2 O# A) {( X, Z/ e$ @
----------, u9 c7 @# _$ a, I# A; h- n
0 ~$ e' |* i- T
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];6 y5 Q ?9 E0 m\\" l
- mvar:
- # [% N- Q2 G/ ` m. h$ @
- main0(::a)=
- ; U( x7 ]5 u9 ?6 | i, }# ^
- a = linspace(1,1,1000),
- + m( n5 G% v1 m& M: O8 M/ |
- t0=clock(),( G9 s; D( ^ f2 [: V
- k=0, while{k<10000,
- 7 [! u1 ], X1 n% I8 B2 X
- i=0, while{i<1000, A(a,i)=2, i++},. ]* J* y0 m( d: P
- k++
- / [. }. q9 K7 Y) r3 q
- },
- 2 t7 B3 ?. M& F& c+ C
- [clock()-t0]/1000;; x\\" y9 @: l5 w! P+ F
- : z/ V5 l\\" u% T4 H' ~( A' h* f; D
- main1(::a)=
- 6 T: F& ~% i+ }4 }, H' b6 g\\" y
- t0=clock(), s=0,
- . T! O1 b/ j& f; }: z/ W\\" Q+ ]# F
- k=0, while{k<10000,
- 1 d) j( p+ V* ?* D
- i=0, while{i<1000, s=s+A(a,i), i++},' x$ r. V3 t$ u1 ?. K8 b: l
- k++
- 5 J+ o6 l\\" V, \: Y) n
- },
- ' ?* n8 g6 q, {) k; N4 F6 f
- s;
- & j6 k5 j! O( N X1 P
- [clock()-t0]/1000;
结果:
9 A* L2 U6 j q10.469: Q3 P2 X& F! g- M' r
20000000.
1 W6 s, S- U- w3.781
( V1 U0 N4 `8 I F
3 \* p$ L8 ~( [4 \& i-------5 Z" n: F6 f9 R( m+ d
: @. ]* A* ]8 J% Q
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
, @" u2 V. D7 I在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。& f! N- v; ?; s. A0 }1 t% s: ~/ {, @
. m' ^ o5 [- {6 Z7 t. Z
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。$ n8 J1 u4 H8 C# N- O
/ ^5 X( h, L' s7 R) i: o$ Z2 d
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
4 B' s( g9 t4 `4 B0 l* B; \& ]6 \* z* p) ~
5、在循环中加点东西& M* ^. X$ o! Z) X, W7 Q; X
. K% z m% |" e" kmatlab代码:- >> clear all O: B- q' k) C ~. |* {. W4 Y
- f=@(x)x+1;9 F( I# d4 H( u( U# |+ y. R
- a = linspace(2,2,1000);
- o: U# a: i* M* e; b$ A - tic
$ n& i+ C, n; {) t - s=0;
, P9 _- B6 Z& T - for k=1:1000
( J6 u% P* V: F8 k5 s - for i=1:1000# L' U. P7 M d( h\" j% P* o0 Y: 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));0 [1 {0 p6 G* C5 w9 c\" j
- end( Y( _# m2 e- Q+ ?& G
- end, c! r) n3 U) B! h
- s
4 I* ~8 Y7 |1 `9 e0 F! W - toc4 F0 Y2 g% h1 J* G
& W; y2 Q: }: D k1 e- s =$ a3 B$ ?. q' ^+ c$ T' c: r
+ T: y# q# C3 l& C9 x! g- 2.4002e+007
, ?4 v1 _* a: P( G\" ], r! Y( I
: w/ V) `/ \8 K6 g4 s$ l3 u8 h- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];8 n; F) v! A( j6 P2 `
- mvar:! D2 v9 l, W1 }! p, l
- f(x)=x+1;
- ) W$ }, A* ?0 C- {
- main0(::a)=* T7 z' I\\" T! R ^+ Y4 L q
- a = linspace(2,2,1000),/ d! e3 c! w: ]/ z, _\\" I
- t0=clock(), s=0,7 Y( [/ P5 E& f0 w
- k=0, while{k<1000, L$ B, g7 ]6 k& g5 C3 l
- 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++},* C2 W, ]\\" K- ^& Q: r2 r _7 j
- k++$ V9 S8 _( m4 W. \# [
- },- s; m+ N2 C) V: G' Z+ t
- s;% ]; h# ]* j\\" m
- [clock()-t0]/1000;
结果:5 X7 J" Z l, a; E) Z6 m
24002271.69189384
5 q4 G3 q/ K! P( j5.172
S5 Q+ M* [) h1 L# Z; J. W2 f, f5 g9 B: Y' i
二者效率现在只有一倍差距。1 o# I: }8 l& V8 s- l6 ?( `
$ G+ p& F N$ E+ b0 ?& S' R
----------; Y0 N e6 a0 o! P5 l% _
2 h& W7 `1 t+ H1 K不过,显然matlab和Forcal的程序应该这样写:7 [: k3 H; m9 Q f" H- R
; f! a: Q8 t; B, J- [- S
matlab程序:- clear all9 G\" h! [) X1 G' i% A% {
- f=@(x)x+1;
/ F# w9 k: {% D! K( i3 q - a = linspace(2,2,1000);6 o- T% c6 D1 `* s$ h
- tic. [: C5 F& l, S0 j6 h9 t
- s=0;$ T9 }( x' U4 M0 x S
- for k=1:1000
v4 U5 w- d- i, ~8 r; R - for i=1:10001 [- x: v& m* b; p
- t=a(i);/ O; S; U/ k) 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);
# x, L3 n% Y# I - end
\" n2 Q( G3 @$ k( w6 |. J( z2 i - end
/ Y/ z+ F8 M5 W, {+ r7 M# z' ] - s' ^# k0 y+ ^3 Q
- toc
: _, O3 _1 \: }: m$ Z, ^\" _; i
& a5 @5 m ]- x/ x! ]* P- s =; |) S6 L' [& ?! V
- ' T) ]$ H* |7 C9 L$ {
- 2.4002e+007
4 w6 D\" }! m3 g- ?% I
\" N. [8 H b) H7 Q- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- 9 B# u6 q- @\\" w5 m; z' \
- mvar:/ M; _7 n5 R: ~- @# u! s; c8 Z
- f(x)=x+1;
- \\" \, [9 e* {+ S4 I
- main0(::a)=8 r# o3 Q- z9 K5 h4 m& I9 o4 Z
- a = linspace(2,2,1000),
- ' Q) e! c+ `6 p/ \! e3 ]
- t0=clock(), s=0,
- ) h: b# e7 h' i5 H+ r
- k=0, while{k<1000,9 g2 N- C; v; z1 Y
- 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++},* N* C5 v1 ?2 X& N: m
- k++% {2 L: m N& ~5 F4 S- @% B% k
- },
- + R; f. E& w; r6 x
- s;
- / d/ C: q' U+ N! _' p4 Z) l
- [clock()-t0]/1000;
结果:
1 I; i, }. `% _24002271.69189384
8 _8 o8 ?+ Z" J: u! {1.6256 {2 I/ x& w( C4 D4 j
' i) y! p7 x) ]1 `matlab效率已不及Forcal。* m1 b/ y3 c! H0 o, U
# d( R w: y9 v$ e7 y提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|