- 在线时间
- 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的数组存取效率非常高
$ l+ }9 e* ^! v, f* o& p" g' \3 g1 I8 l/ q" w
Matlab代码:- >> clear all& L6 N. D: k& G. m' [: b: b' m) W* T
- a = linspace(1,1,1000);
& Q3 K9 x$ v% y3 { - tic/ b3 u$ {# ~3 |7 ?
- for k=1:10000+ W5 p4 B! w2 L; E/ J
- for i=1:1000 Q- K2 G: B4 Q. I8 t/ O
- a(i)=2;/ J; @; F* q+ c0 A( [+ F
- end% V2 g/ a4 [ h* |' w) N( A& r6 u
- end `2 D3 W- s3 ^0 p
- toc
6 X' b. E% @2 m% L - 5 K1 U0 B5 q3 T' M( S* q, l$ S
- tic
8 h9 F( u: N1 L. d: F2 Q - s=0;
2 n1 i/ i: i\" h, X( y - for k=1:10000
+ [7 o5 z( t9 _. C; f3 x2 {& V Q - for i=1:1000; T/ l9 v7 m+ i x
- s=s+a(i);
9 T8 n% [9 w b/ w. s. V! B% P0 e\" o - end
! S) l6 q# i3 p - end* ]6 H& _; c& L# b
- s
1 O: ^\" I$ B* U: j8 Z8 ? - toc
, T\" I4 k9 t\" r ]+ J - Elapsed time is 0.140658 seconds.
' \+ G+ e1 w5 Y\" p8 j - ! K3 A: l$ a# n Y0 c0 o2 c$ s- d+ f
- s =8 V0 j& e( ?4 H! z( A! r( V/ |
- 7 Y9 D9 G- Y! K* ^
- 20000000
. w2 g6 i\" U) G\" K4 _- ^
7 T/ m0 r7 w# G# u% B- Elapsed time is 0.091794 seconds.
复制代码 ============
/ m6 ^4 w! j5 A1 K# b9 Z7 g |9 G' M$ N
Forcal代码: - !using["math","sys"];
- 5 U9 U. a7 O$ G
- mvar:
- # m7 h9 W5 E4 p5 x! M8 `
- main0(::a)=0 d3 Z- K ?) w+ I# R# z
- a = linspace(1,1,1000),
- 9 D\\" N) l& X$ K9 H
- t0=clock(),
- ( A; |- e' }7 w
- k=0, while{k<10000,: P+ p3 _1 @, a
- i=0, while{i<1000, a(i)=2, i++},
- ) \\\" [9 H5 D$ R, }
- k++
- 4 Y! G! s, W' |. ^0 v! U; m7 }
- },
- 3 I* ]. v: S t) l% _
- [clock()-t0]/1000;
- 6 G8 R1 k\\" x( h$ m0 d6 t
- . G\\" }) _1 S/ |, c; q* X8 L
- main1(::a)=- S. m9 p1 ^8 ?
- t0=clock(), s=0,
- + O: h6 {# N8 l6 D, C) b
- k=0, while{k<10000, @2 y0 y0 U6 I* t
- i=0, while{i<1000, s=s+a(i), i++},
- ; F, b\\" y' S% ^
- k++
- ; ]5 b1 c( X5 a& k, r9 g& v7 N2 h& y
- },! @2 P+ x5 U+ B) ?\\" J1 t; E
- s;! ?+ g6 ~9 t, c; P5 D4 t; Y3 h- m\\" X
- [clock()-t0]/1000;
结果:4 h: u5 N$ u3 _) u
15.484 //存数据所用时间,秒& \7 a3 G; t# f+ y7 ]1 O
20000000.
; N+ C. U- W' i; t5.531 //取数据所用时间,秒
" K c% D+ ~& K) }+ n2 o+ m' p8 o3 n/ q1 b: F
----------
8 p. _! p5 q. k; |3 b
( d' F+ Y" R8 W* q1 g用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- ' J4 t! e. X! k' [
- mvar:% F; [8 j* \- x! \
- main0(::a)=' C& J# Q' V1 S. r
- a = linspace(1,1,1000),
- 9 l/ A3 a6 \! V: ~
- t0=clock(),
- 5 l7 O$ b _1 w7 o; T# i8 L$ ]0 k
- k=0, while{k<10000,; E0 Q% j! K# X' A) B: v. e
- i=0, while{i<1000, A(a,i)=2, i++},
- 9 U) ` i\\" G0 U- [! A
- k++: ]( B: R1 d0 [1 @$ D- y
- },5 U( V; H9 _# Z' n- o; O( E
- [clock()-t0]/1000;; W/ U V1 R: E9 w
- ( d4 r. Q# N% `. O5 f8 A5 ^
- main1(::a)=
- P- A8 U5 B1 _2 w# m. U
- t0=clock(), s=0,5 N& `) S4 _8 B' `; w' H8 {. w
- k=0, while{k<10000,
- # g# A6 w- t. H, {3 O
- i=0, while{i<1000, s=s+A(a,i), i++},
- : }4 x5 E0 X7 }\\" s# A N( J
- k++4 i$ e! r$ |; O& ^
- },1 }+ h% z' W3 w! T! I F
- s;
- ( Q* T) A F8 H\\" s$ v* c1 S3 a/ G
- [clock()-t0]/1000;
结果:/ k; {# R+ `. D/ [' u
10.469# f3 I4 d0 t3 K7 b- U5 `/ h
20000000.( H( r) X7 G9 u' W4 l# G( O
3.781
2 y, k* S& K9 h& z. C" |& R w0 c" v; A3 e6 P& @1 m/ {. `' P6 S
-------
- s [0 a( ]; c- Y0 b; I2 |5 L
7 d/ E7 i4 o8 A! i/ Q* a ~6 ?) g在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。 F' ^5 t1 j$ I" P8 t
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
1 n# ?" J D: e% r/ d+ n& k c6 X* O+ S$ B8 B. ?; N: g
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。9 Q& c' I! @" m- g& a* R6 Z
' O6 y! ~3 |4 w, B2 EForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
, W0 ~" f$ z) P. ?; |. a
% h* c z1 I k" U5、在循环中加点东西5 H2 k, E/ y' x. E% @
7 n1 f; C/ j- }+ `
matlab代码:- >> clear all5 X# `( V\" {& n9 L- f
- f=@(x)x+1;, K* m1 ^' G) w6 u
- a = linspace(2,2,1000);5 r, t8 L\" H2 z5 D: C5 Y( c [. I
- tic
( X- y& H9 Y3 z6 [) h8 v* W - s=0;
\" _5 W, h# _+ ~0 i6 ?5 A - for k=1:1000
) I% |! V& d' d4 ` - for i=1:10002 W$ H& A\" J. J0 S( }! W
- 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));
, @: u& I' s0 ?4 b$ p0 B2 ~7 C1 N w - end4 ~/ [\" Y* l* O1 k5 i- z( c. v
- end
2 c5 X: }) Z% C1 [% [9 d: \ - s$ s$ e( o( y' m8 w
- toc
+ \$ |' j/ g1 m - 6 O% z4 }8 Q/ A O' K5 D# `
- s =+ h2 |% V1 G) f; n( b
- 7 S) H7 `$ k, A# r. R! P
- 2.4002e+007
3 h\" T$ [, l% b: _: |1 @ - $ I0 N: q- M( b, o) @; }: N
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];$ h7 H+ ?; ]8 _) t( l6 a' Y
- mvar:9 R; i7 X3 `3 l1 D; V& u J; r/ o
- f(x)=x+1; b1 R6 Q( {! }
- main0(::a)=
- ' x* Q$ v\\" o1 o& R$ u) C0 |. A
- a = linspace(2,2,1000),
- : d4 f5 q+ k0 X; ^& x; X
- t0=clock(), s=0,3 K4 v3 \7 O\\" l% I
- k=0, while{k<1000,# @6 i! @! ?4 ^+ _+ P& 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++},
- : x' q$ o- N% y4 c
- k++
- $ k! v1 v0 z3 }9 V9 P$ Y1 d8 m
- },
- ( W; z4 D* {2 Q7 L# O w
- s;6 o1 s4 E) v\\" Y9 C* E# S
- [clock()-t0]/1000;
结果:+ s6 f9 J& y* }! `. C6 z
24002271.69189384+ F' a* h4 a, Q+ ]! v
5.172
; j- R k U3 N1 ^( `+ O+ i. P) I+ w Q6 v
二者效率现在只有一倍差距。
; Q* q# g, g& Y; P9 P6 R0 |8 u2 b8 {6 f/ q6 f: X+ D1 l
----------/ T% J0 i8 ?' {3 g: e9 B1 R* a. o
4 f6 m4 N! T# n不过,显然matlab和Forcal的程序应该这样写:
- B7 Q, m A6 X' }" Z8 S9 o+ m- A$ q/ W$ {- f8 x& ]
matlab程序:- clear all$ f6 y4 N9 T\" E9 p
- f=@(x)x+1;
! g8 Z6 L* e6 d- M - a = linspace(2,2,1000);$ N& F. Z! p6 @; n1 y9 V: g6 f
- tic
' i, ~2 l5 X% D# d - s=0;
4 E7 K. R6 j( i; t - for k=1:1000
- A' E8 X2 C' u/ o, Y. @ - for i=1:1000
4 i# t- Y: |6 d# N1 Q3 R: ]3 D - t=a(i);; k0 \- W/ R4 A) ~0 ~
- 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);% S* }! `0 b4 t1 P
- end
; M& T! k5 T0 n2 { - end
4 L5 p0 K, a: D: E\" @8 b - s
/ x5 T, \1 n* Y - toc# k, X3 ]9 b( J/ ?1 ]) C
\" n. b( X! h; g( s `- s =, S8 k- q6 D& W7 m6 ` s6 \* e
- * ~! g5 {; h# L\" I/ U( ?6 F
- 2.4002e+007# L+ ?) R9 k* J8 m
: z& U7 L8 X5 g) e4 J/ ?# y- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- $ L5 j) \\\" \) _ S: y `: z: F0 d
- mvar:' W. p6 D2 v4 G0 a, y, i
- f(x)=x+1;
- 5 y9 N7 b; Q* K
- main0(::a)=5 j\\" s1 Q# b9 @7 ^! n3 f
- a = linspace(2,2,1000),8 v* f% c, S$ Z& E5 w; J* z
- t0=clock(), s=0,7 g' z) ]8 `- |5 }% A1 t# H, y8 @
- k=0, while{k<1000,- J7 q2 T4 ?' m
- 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++},
- ) r J5 r- x' n8 V
- k++
- . f0 @( ~0 q+ a
- },
- 6 t) N$ w3 h2 ?/ d7 V
- s;
- 2 w+ Y. L. b- A4 @ p
- [clock()-t0]/1000;
结果:4 Z5 t7 z( S3 N; T) }5 @* D
24002271.691893845 _, ~0 d; f t8 E7 _
1.625
. h% h" W* N# z: x1 L) k
$ i0 A' A A8 [* Q: P8 f4 @matlab效率已不及Forcal。 A7 d# X" R3 L. h" V
7 R. f+ q' F9 J9 [
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|