- 在线时间
- 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 \# R* k) ~8 [( B% F8 y0 M5 {
9 Y' O! L) y" V8 VMatlab代码:- >> clear all) n% Y- _! T7 b+ e6 |, K! |
- a = linspace(1,1,1000);
% P( T; v; c$ o' O - tic0 d- {9 \- u\" d
- for k=1:10000
! [: f8 `9 K$ W. b# u0 j; U- ? - for i=1:1000: ^. K! M# _; O1 Q8 c
- a(i)=2;
, F n$ A' L- q\" u$ ]0 \& O( z4 x - end% M1 l# S9 N) Y+ s
- end2 J, ~5 b2 Z* d
- toc
7 M/ n, V `$ ? - + s$ P8 ?8 r\" P! G7 x7 r! l
- tic
/ a$ K1 w. u( e3 X9 K4 q- i - s=0;
6 w8 k; }' Q; @! {+ F\" p - for k=1:10000: u5 U9 O5 ~6 }( |
- for i=1:1000& `1 U+ {+ u# R/ `. G0 Q
- s=s+a(i);
6 m0 m: X/ _ ?# z% g - end
1 {+ `4 ]& d: P\" I1 V( E - end
6 U0 y7 ]4 D8 i\" v3 g' v, D - s$ ~3 H5 M4 X' O% e# D
- toc; _# W' |5 L. ]) c5 U* B
- Elapsed time is 0.140658 seconds.
: O& K3 S6 Y: X2 {4 [8 X\" N
; ^6 G9 N# `. s% f2 P- s =\" D, s. K6 ]! \' O- g
. n& f' H- c) U5 Z- 200000001 p5 W6 Z8 r0 p/ p( m
- D5 @8 @9 }5 A
- Elapsed time is 0.091794 seconds.
复制代码 ============" I1 C, @& S: f4 i
& g/ y; C# p R" V( e% UForcal代码: - !using["math","sys"];
- # B7 B2 }+ ?5 u. I- E
- mvar:5 Y\\" e3 @\\" J2 S8 u, Q\\" R
- main0(::a)=
- $ | m5 \7 _8 |, g5 o' a# d$ }
- a = linspace(1,1,1000),8 n) Y$ N, B/ Q2 h2 R+ M1 n
- t0=clock(),
- x1 h9 R9 |3 y: F+ w( S4 l+ W
- k=0, while{k<10000,; W( @5 t, G m+ r! l# |* [: N2 f
- i=0, while{i<1000, a(i)=2, i++},2 H8 W' @+ n7 I7 |. A p, C9 P$ L
- k++
- ; J- S9 w- _0 r6 _& g2 P- u
- },\\" e/ u. R* C9 E4 P\\" y6 O$ F( h\\" n$ @
- [clock()-t0]/1000;3 T/ o. _( U- f) s0 \: j& h
- % W/ d5 l. p8 A& h( V- l) B
- main1(::a)=
- - v, q/ f$ `* L1 l$ @
- t0=clock(), s=0,
- 4 @ H) b0 j- M2 r, S! v
- k=0, while{k<10000,
- ( F2 i) _7 x2 I0 R, ?* x x
- i=0, while{i<1000, s=s+a(i), i++},; c0 h8 w2 `\\" t
- k++8 T& r7 F* c. Z8 m/ u: e
- },
- 7 B' D$ w5 @8 b
- s;# W8 H y2 B8 G2 N$ D4 w8 }
- [clock()-t0]/1000;
结果:: R6 k" E" D$ g2 }
15.484 //存数据所用时间,秒
" D: ]3 k5 N' s5 g20000000.; q! ~& B# w) T2 F* W2 T
5.531 //取数据所用时间,秒
" T0 [% h0 |8 F/ V, z5 l
9 `; o1 t5 V2 B* g: h----------
2 N5 T% e$ L9 N2 f5 B/ h: ?4 }; q, |( L0 Y. f+ B+ F2 Q4 D
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- 0 w i$ x4 h; Q N& o# S. L\\" M
- mvar:& Y- @$ i H! p
- main0(::a)=( P( C) j& P: {5 S% j
- a = linspace(1,1,1000),: Q, Y1 V ]: Z. P; S/ E
- t0=clock(),
- ( X. _, Q x\\" ~2 h5 |+ `
- k=0, while{k<10000,
- & n( h! |* w8 P2 K1 q# p: ]1 L
- i=0, while{i<1000, A(a,i)=2, i++},
- , D/ V2 ?! |6 c, g\\" h3 J
- k+++ P R! }) B1 e+ q; Y
- },; j6 G. O7 F' J# f0 f/ L0 L
- [clock()-t0]/1000;. }& {* H) a* R# f$ n7 B4 g! B8 r
- 9 M% |# o6 m) y/ |4 p& v; o
- main1(::a)=
- 5 y* v1 P2 ]8 S4 l* [$ t( e
- t0=clock(), s=0,% {! F+ j! }4 U+ N0 W
- k=0, while{k<10000,5 c: v$ ^5 E( t
- i=0, while{i<1000, s=s+A(a,i), i++},! M+ `/ V4 d* B, q& v8 s
- k++- u- n; }3 B\\" c- F
- },! [; G* a+ L% E
- s;+ K9 i4 Q& D# e* r
- [clock()-t0]/1000;
结果:' Y2 Q5 \, V$ r: U' i5 x" T
10.469* j$ w; k- c- d6 v
20000000.4 [' n% {2 F8 M+ a$ m* S
3.781! u o% x2 H# k1 M
6 |" @- g8 d+ T$ k' q-------# G1 P- t* \6 v( y6 j" I
; D9 J$ S- L! _- V在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
9 o w/ f. w5 P. V在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
& g( @3 X) ^4 b7 ]( b+ P1 ^ x% {2 w, t3 ^" D; B4 ~0 y
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
8 J! e8 K( J6 `# a6 p* p: H9 c L4 D6 _8 N& ?1 K
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。5 I1 ^9 K' ?! v; z) |) o+ q
+ f- I* o) l0 T; W6 Y, v5、在循环中加点东西% \6 ~1 r% x3 g" K( U
# R' z# c2 @1 I8 g A' @9 t
matlab代码:- >> clear all) R! ^, I v: P' t
- f=@(x)x+1;9 k0 _, w9 B/ v
- a = linspace(2,2,1000);
( d9 V9 H+ _8 ~* z' Z; E! u - tic1 r& t( s5 b2 o6 h
- s=0;
( [/ e\" m3 a/ Z3 L0 a, ? - for k=1:10005 X& }: T: {' S; d8 e7 {
- for i=1:1000
* i- J/ ]) A( B - 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));; M% C+ I3 w! r\" f( U; g \1 z$ y8 ]6 P5 y
- end) B, g# R( a% K0 a# u# [
- end
% A9 S# A* w- S) O - s
+ B: ] A5 @% ] - toc
`0 @& W' a9 N3 N/ W - # [9 \% |* D: w x) \3 O
- s =
; O# c& L3 S! m4 N/ v - ; v2 B8 |! @( w f3 J
- 2.4002e+007$ ]% K. T5 b: z9 u' W, w! t2 t2 N
6 [' N& r& L7 {3 l! X2 d7 ~( y- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];, G0 B8 m4 P' F& m0 o
- mvar:
- % @. u ~6 H8 A2 I
- f(x)=x+1;9 q9 z$ T+ |# M- E5 @. b9 r! I
- main0(::a)=8 n, z! ?# D* R, }) A
- a = linspace(2,2,1000),
- & {0 X\\" }; Y _
- t0=clock(), s=0,
- ( h9 O/ _/ n- D0 j; ~2 p) u: ~
- k=0, while{k<1000,9 l& B) W) C( Q2 F: @7 F
- 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++},; |& D: p8 w- t& o7 ^
- k+++ U8 F6 b5 I# J9 E0 ~5 e
- },1 y% m3 X+ N I. y( }7 B8 y6 a- K
- s;( v, U+ [& K3 l# c: o! g
- [clock()-t0]/1000;
结果:
8 ^) v) d* V5 E$ k/ v! d24002271.691893843 C& R x( t# B K8 q
5.172- _# k5 \5 v, T& H
5 Y t# l6 Y) p* w/ F9 i; \二者效率现在只有一倍差距。
# `9 \ b G5 T7 m4 O! q: X2 C0 S9 j+ d% w* |) U& h
----------
- S" U' c b% u0 B2 R# }+ r8 L1 }1 t2 c/ W7 W4 Q
不过,显然matlab和Forcal的程序应该这样写:, [. ? \, w/ R/ q) {) u* m" \
4 Z7 ?% }. l4 i1 \/ I1 ^matlab程序:- clear all
2 X0 d# i. I1 H( R5 X - f=@(x)x+1; ?8 e9 {3 ]& S8 z9 o
- a = linspace(2,2,1000);
0 t% S\" H- v& w% T& V - tic
# B; |* U- F1 a# u3 X7 n\" r - s=0;( d; ~ N; B% C0 O2 n
- for k=1:10005 u# j( w% X9 J. I; t# Q& y
- for i=1:1000
: b' m! O3 l! b% Q& Y6 C3 d - t=a(i);
q. F+ G$ K7 p6 X. G+ E - 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);6 x3 K- V$ `5 z+ X$ l
- end
' t. X, {3 G/ o; o$ g1 z - end0 p+ ~) n8 d, L6 g3 H
- s
* | g\" w3 ]2 ]$ g$ e' @. L - toc, I# _4 r; Q% h- _0 K
- ) T. z a. l! l0 s3 x6 ^
- s =0 a0 Q% v/ C\" c7 p' C/ n9 o4 v9 O4 n
- 2 u2 Q, b+ @+ i4 g, N
- 2.4002e+0075 s3 F4 L5 }* w- H6 I
- 5 P# z! p L: Y! f& s- M
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- $ G1 H7 |( h3 J* f
- mvar:
- ( C- H% g/ M/ P! ], Q1 F. ^
- f(x)=x+1;$ b: _$ u* u: i! E* r
- main0(::a)=+ X- T9 ~9 b( A! d% |
- a = linspace(2,2,1000),
- 5 Y! I; Z2 S6 ^
- t0=clock(), s=0,
- 9 @: Z) U9 x6 q: D: w
- k=0, while{k<1000,
- 0 [4 x4 z8 I6 H: F% r
- 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++},5 q5 u S. ?& M/ q, w
- k++! ^- X6 V6 m+ x+ d6 c, G9 x$ ^
- },
- * x7 |2 `! t i, @# n7 l0 m' |7 \
- s;
- ; `7 M# J& ~* q; q7 Z7 a4 a$ J
- [clock()-t0]/1000;
结果:
+ s+ w6 @! n( A9 n- h2 }24002271.69189384
- e e* ?7 y* Q _ o1.625! W& G1 C7 @8 W) \
1 _5 X, t# g8 `; n
matlab效率已不及Forcal。7 @/ ^6 v: t+ L- C- P- }2 w6 O; G
1 N8 W- r( I+ h x' N1 X6 V% G- m' M提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|