- 在线时间
- 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的数组存取效率非常高
$ [6 d) ]9 m: D1 g, R1 r
' j' k; L; C, y& m* hMatlab代码:- >> clear all
/ |4 t; o. k X j - a = linspace(1,1,1000);; G3 \9 {9 p' T
- tic( M7 S# n% N& b) w# O \
- for k=1:10000
6 Z7 J0 H7 l% {* d' s6 l - for i=1:1000
3 C6 Y4 @( @8 K - a(i)=2;0 |4 }) a* p: B( [
- end
0 V; @% Q2 n5 v+ K - end6 |3 C$ N) w\" x) E
- toc8 Z! R; H# b/ Q4 Z- a
- 6 y: O+ c \& E5 B6 K. T# a) w
- tic, N O2 P( [% O9 u0 H
- s=0;; J3 D. v8 Q( A
- for k=1:100001 a* y/ X9 Q6 _! ^) q T* W# Y
- for i=1:1000
, _: ?! T* J# T. l - s=s+a(i); y4 p9 Q4 z- Y M) @' @. p
- end
; i& m+ J8 U* F8 h - end
7 o4 S6 t- n3 L; G5 D8 E0 `8 g - s
9 z& H! T3 d/ a( }7 q& K - toc8 M\" u\" @. V t2 T; u& P\" ?' U
- Elapsed time is 0.140658 seconds.
7 \5 M1 r& w, Y/ w$ k - ' P; z' ~8 p) q* P$ [* H
- s =
4 d& |% \* l$ M9 [
+ a. O7 P2 U' M- H/ z- 20000000
4 n; Y; F q& L% c) _ U; o - $ X2 ~7 Z v- X6 x
- Elapsed time is 0.091794 seconds.
复制代码 ============
/ V& ? V$ E) ]! ~! o; y' s
7 P+ @- \% ~" PForcal代码: - !using["math","sys"];7 _! i8 z2 ^/ e/ ?
- mvar:
- * I2 @4 B5 C0 y3 i2 F) E
- main0(::a)=' c+ ?& G# C\\" S& ]( }
- a = linspace(1,1,1000),8 S; X B3 ]& w) e\\" I
- t0=clock(),
- 3 A2 h5 |# `5 \$ r& d, R) ]
- k=0, while{k<10000,' @% s; a* Q* N; O\\" S
- i=0, while{i<1000, a(i)=2, i++},
- * n$ C' C) }% \, U
- k++
- - o7 j, V, \- j\\" E! ~! d
- },
- ( J* j( ?0 ?$ q
- [clock()-t0]/1000;
- : x; W/ D6 [( S/ I1 G, Y6 p
- 1 x5 T) a7 m! n q# q
- main1(::a)=
- ) e) Y/ c9 Q- C/ w
- t0=clock(), s=0,
- 2 R, k- n- p8 ^& a7 A D
- k=0, while{k<10000,+ n& P1 ?+ o* n' p& B# ]\\" a2 O
- i=0, while{i<1000, s=s+a(i), i++},! _5 N& |# s. c, M3 F/ l4 m( G7 e; n
- k++
- 5 q! y. y- D8 H% G. x8 O7 Z
- },
- ! ~4 P1 G3 _+ i& Z1 n
- s;
- 2 f: J! a, ~1 s2 |
- [clock()-t0]/1000;
结果:
! J& @4 c5 y/ a, A8 U0 b5 b& d9 c15.484 //存数据所用时间,秒
$ [" a" r* I2 ]1 G( Z20000000.
$ r2 m- ^6 V) `( Q4 j0 E1 l5.531 //取数据所用时间,秒% X! U+ N0 | w9 O6 y ^% p8 y/ t* V
, o* S; R& ]* D( `# k h/ ^
----------6 C+ @8 S. o! }# o
# g+ v+ G5 P% }- Z M2 t/ X用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];5 p( @# n$ {0 [/ @2 B
- mvar:7 b; W' N/ C& p
- main0(::a)=: i; ^- F) Z; v* X+ `: T* F
- a = linspace(1,1,1000),
- : E& H6 X/ J) l( g
- t0=clock(),
- ! P/ l1 B\\" k+ J6 t# N
- k=0, while{k<10000,# Q A# D* [6 }
- i=0, while{i<1000, A(a,i)=2, i++},/ ?# z5 v* M0 f7 _- c. _
- k+++ W3 m, p: Q( w5 Z
- },# ^& b! l6 z! K( v5 F! T4 v: ]
- [clock()-t0]/1000;
- N- ?( j) c0 n4 E! U1 e2 I+ f: H
- 9 o& \! K4 e: T; [+ c1 W
- main1(::a)=2 e; s/ S$ ?9 T
- t0=clock(), s=0,
- 3 h( G+ T+ f! _5 v
- k=0, while{k<10000,# {! d7 `, n' O- e+ Q9 X
- i=0, while{i<1000, s=s+A(a,i), i++},
- 2 E, Y0 v$ Q! }+ g0 J& h
- k++3 u% D Z6 }! j0 f+ k
- },
- ; @\\" f. ]\\" N\\" F# u8 ^2 C3 U! A% F
- s;
- & z. ^* K& g4 Y3 f; v% O$ f
- [clock()-t0]/1000;
结果:
* Q. y& {6 M; H: s S10.469
0 q4 y9 ?0 D: s7 f" p1 B6 I4 ? W20000000.! y* D3 w& p% {% e; x0 h4 y
3.781' z/ p, ~& U, Y# B8 }
, e, ^" m/ k( h( K/ A. e-------0 l- G3 M* e& z) n: E' Y l" a
" a6 K7 v9 J8 T
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。. K' z' ^7 e1 o; q
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。6 m3 {# @0 a) j0 j8 f6 F
8 I, T4 u% z7 V& }. M2 O
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。2 U+ B( z7 h: G: s
5 P8 h+ o; U+ l. l4 KForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
9 [+ E8 S# l& b- C2 c- n. [: T! x/ Z1 Q9 }4 K B
5、在循环中加点东西' O6 J \- N0 o* U* p5 {
' V) @- l* ]- N T1 Q1 N: hmatlab代码:- >> clear all
0 u0 O: S' c\" \ - f=@(x)x+1; [! Y4 X( C4 K! U: J
- a = linspace(2,2,1000);+ T! e5 _9 i8 Z% j5 c5 [. R
- tic
) P ^) k# D: G$ e4 x8 s$ ^ - s=0;0 \, F- m: ~9 P/ {
- for k=1:1000' Z- h3 c+ u* N1 ^
- for i=1:1000
, t1 n% w- a4 v( F S7 | - 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));4 ]- M9 Y, R1 _- N& ]
- end
8 x! B4 j8 a% u1 B - end
& E- q$ z: Q5 i% H - s
- g! G' A7 F. Z9 C6 W\" s/ K - toc
. o% U1 h8 T. k& @ - ) m2 |% l8 N, j3 B; x
- s =
) A E7 B! P2 D% T. a# R - 1 Y/ [; c7 T. e }/ t! c% V: Z# y
- 2.4002e+007
2 x( S3 ~. l9 x
+ Y; m5 g) a- N8 b5 H- n$ d- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];% x! O$ j: Q- B5 F( N) l7 _
- mvar:
- . [4 k\\" a0 W% b1 k. p# n
- f(x)=x+1;
- F5 \- [) k1 W7 I8 I) w
- main0(::a)=
- + _* T6 D9 T# P/ i
- a = linspace(2,2,1000),
- 2 D( M& w m4 C& y4 q
- t0=clock(), s=0, E Z; H8 X. {0 R: ^
- k=0, while{k<1000,
- ' w; T& ~. d3 \: k' w
- 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++},
- & S\\" `) g$ u4 T. f
- k++
- ) M8 K+ I z8 r2 I& {- D$ J% }
- },
- + z) S\\" ?+ Q( p6 G
- s;
- 5 [' W: X) M\\" I- y$ k9 d5 U; n
- [clock()-t0]/1000;
结果:# } P$ g) K" \' F
24002271.69189384
' X6 I s1 G2 V# [: @" _/ |5 I5.172
! e2 X" ^* K; h, D( Z: I0 i# G/ _; }" n# k. G
二者效率现在只有一倍差距。. @3 ^+ z6 `- b/ _! j' @0 ~/ ]1 G
5 o: U. y0 t4 j# X2 `* s1 u- G----------
' ?5 a8 Q1 Y8 @& ~8 |0 a" \
3 L4 W, I# L% Z不过,显然matlab和Forcal的程序应该这样写:5 o/ S/ U/ n; w% U: T4 w9 q
, e" ]8 n+ Y5 g$ O5 R. D
matlab程序:- clear all& r3 I: U3 A5 u+ ]. a+ x, O
- f=@(x)x+1;
% X8 T+ l; j z8 h% X O( E$ [' G0 ] - a = linspace(2,2,1000);9 V. l. Q3 F: V4 [# D5 w
- tic% |7 G$ U4 C2 J2 A! }7 N6 v
- s=0;% B l. K: U8 N* n5 N9 \6 T
- for k=1:1000/ |) U) ^9 b& }! g
- for i=1:1000
1 s; u0 g' s9 A4 v$ ], F1 h - t=a(i);7 W0 M( R: X' U5 G( l4 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);
! C7 ^* H* f4 j4 e$ L - end3 f H$ ~# o% H- Q+ o' _3 x9 _
- end
2 D& K9 A. k\" Y6 I0 B8 F9 |\" \& E - s
* Z3 h6 T2 t/ Y( i6 Z - toc
7 I% \9 }/ ?: e\" O/ r+ ` - ; F6 S9 q9 W* h* E
- s =% D% y- F) d5 I* U( o! L* Y
2 m$ _+ o6 r& R- 2.4002e+007
, D2 G- `# z1 j' C+ C8 G6 _& l - - {+ H# x, l( X$ R
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];( t( t. W/ _( v2 f
- mvar:
- $ G' F: E) b/ c5 n4 J
- f(x)=x+1;
- 6 q( c. R. m2 g0 C8 D
- main0(::a)=
- 8 t$ Y8 |\\" S' M' [/ t! p) `
- a = linspace(2,2,1000),4 r/ f% H; b& E: K
- t0=clock(), s=0,
- \\" H$ V: ]; D0 U1 t
- k=0, while{k<1000,0 |% s: D! u0 I. s, 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++},
- 9 [1 p8 H) o3 o% J c
- k++
- , R k! E) I4 d( y( R
- },
- , G& B& S8 J) f7 c' ]7 M1 v
- s;8 S z# U5 q9 R8 I6 t
- [clock()-t0]/1000;
结果:
8 l* @) Y1 }4 Q24002271.69189384: W+ G7 c$ `3 i- b) \% {
1.625
2 Y0 N5 L r! b7 @! m) Y3 U( a
8 V; L5 ~, F' Z! Smatlab效率已不及Forcal。
3 r- z- u- Z. I
! w5 v0 G2 m) `: x9 t6 {提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|