- 在线时间
- 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的数组存取效率非常高
7 J ~% c0 _3 V g: n, q# z2 j: c# {+ @( {8 v M8 Q" v
Matlab代码:- >> clear all1 g8 h' N, |; `% v+ Y
- a = linspace(1,1,1000);- @& F. x, \3 R8 Q- B# \0 |
- tic
0 A6 n9 r. T% r! w. U' u/ ^ - for k=1:10000 z% X, [7 ~0 h! [- A
- for i=1:1000! u Y: ` T( z. j, D! d/ F: M$ X
- a(i)=2;
- P- c! [9 P- D\" o# m - end
- {8 l2 u1 q ~+ A/ f ^0 e - end, C* x\" S6 [7 b
- toc# F6 I& V, C: B7 ] `
: ~1 W1 L: h* @: ]2 h+ {2 |; d( \ x- tic
0 {' b\" K\" p, b+ B8 h\" r - s=0;
% d; m U% ?# b+ i K - for k=1:100001 p3 j( G& J( R; c6 B- D
- for i=1:1000) {1 S' O6 v! O/ V8 j+ Z
- s=s+a(i);( s$ |2 p. Y3 o3 v, c4 L# R
- end; h( Q- ^1 g1 P
- end
\" N1 C& Y3 H5 o8 G1 {1 D - s
5 T9 c! W+ ^: g8 V- f - toc
6 ]2 J. E\" z1 w$ H6 K' M - Elapsed time is 0.140658 seconds.
! Z) ?, _' \% u, i) U& X' }! T4 N - 9 G/ v- y6 l0 x$ u5 W\" |
- s =! i1 |7 Q\" V- N
- , ]6 ~9 J& \! f. ~4 B- K; {0 I
- 20000000
7 k! }/ v* ^: T, P: ?4 e - 5 Y [+ \4 U$ F+ I
- Elapsed time is 0.091794 seconds.
复制代码 ============
# l5 b: f" I0 j% T E0 D! K' H! Z0 E3 @
Forcal代码: - !using["math","sys"];& q* s$ a {7 B6 Q. o- i2 f
- mvar:/ G; d+ A! p& Z4 u5 k
- main0(::a)=/ } k# T% w1 ?
- a = linspace(1,1,1000),9 U& Z2 k( Z/ N/ V
- t0=clock(),
- , z; R- p# }1 T# s: {\\" s\\" }
- k=0, while{k<10000,$ i5 O! ~3 i\\" V3 i8 z
- i=0, while{i<1000, a(i)=2, i++},
- 2 V9 d! ]$ W: L\\" J- ?, J
- k++- A7 M5 V+ ]8 T; a
- },
- ( c( ]4 J# p( o' S# z+ a1 h4 M0 f
- [clock()-t0]/1000;
- ! e V4 w/ g6 q6 @ e$ p9 h7 w a
- 7 y% [. S1 \# k4 W$ z5 t% _
- main1(::a)=, O0 C$ P' v% u6 I0 `) ^$ W1 V) q/ p
- t0=clock(), s=0,
- $ y+ o5 \ z) k\\" R* k' ]. Z
- k=0, while{k<10000,
- # Z, G) j/ f* `5 z* T, m
- i=0, while{i<1000, s=s+a(i), i++},& T7 @: V; X& D+ J
- k++
- ! T B; h) `: a5 s# [( D% j
- },
- 6 Z4 O+ h3 N y\\" ]
- s; s4 j0 M+ c9 q3 L$ d
- [clock()-t0]/1000;
结果:, [. u% X" H3 T) @
15.484 //存数据所用时间,秒
; U9 C0 m& @$ A20000000." Z7 C( ?! F, e+ J
5.531 //取数据所用时间,秒
4 ^& f0 l! p" Q$ Q. v
% [9 F/ }" R# }8 s; p" e+ K% J9 T6 Y----------) [6 n# ]: h5 j; G/ |
& w/ J- S/ ]- w; G% W; H/ i用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- % r4 \- O: Q& R) D0 e! @
- mvar:
- , \7 N4 L# I3 M% D0 p
- main0(::a)=# |2 Z7 i1 M# X
- a = linspace(1,1,1000),& I: w+ s- S0 u* o) o+ s
- t0=clock(),! D1 X/ B8 V H( i4 b) L( D
- k=0, while{k<10000,' Q- `( L- X3 [2 Q) z/ M
- i=0, while{i<1000, A(a,i)=2, i++},
- ; c\\" S1 A5 C! a/ a, [' [! {7 O
- k++
- 8 \4 T0 T5 E. \3 Z
- },
- ; W8 R8 K) `9 ]3 W1 ?( I5 s, D3 q
- [clock()-t0]/1000;1 [# h! l, T6 ?- r/ m$ |9 D2 {
- / |' e6 g) A, E0 M( d! |
- main1(::a)=
- |6 i4 d# g* d1 e\\" K4 v
- t0=clock(), s=0,8 o5 o/ `) `# }2 X/ o7 ~, t0 o
- k=0, while{k<10000,
- ' N. K% l\\" y; }+ I
- i=0, while{i<1000, s=s+A(a,i), i++},: `, u: e- ^1 U
- k++
- 0 k0 v. k! V\\" ^
- },6 X+ W/ D( u+ B6 U2 X2 ^3 ~
- s;
- 0 O9 H\\" Y; U4 t1 o- { _% t8 I
- [clock()-t0]/1000;
结果:3 }6 {6 P4 v3 @" `7 ~5 w9 O" Y; T
10.469! o3 w7 j: |/ T P
20000000.
5 Y4 ^: m4 y+ u. ~6 i# d7 K4 }. ?4 B3.7818 Q8 Y% C8 V. a' X0 i
" O8 h0 I9 M5 V8 l/ ?-------
4 m/ b5 V! C6 W) Q/ `
5 \, ], \! }; K: Y在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。0 w" s6 Y" J9 Z( b7 U
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
) k! Q/ e8 N6 Q/ l7 i; c
, p- O. R$ }4 F$ d$ i# b& p; z" @matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。' y9 p9 R9 o+ t, q9 R6 h
# C- t) Y L- x' [ c) |& ]Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
y2 J: i3 i" r0 a
2 o' [3 F9 ~. s5、在循环中加点东西
# @. C' [" o( L& F7 {
7 W8 O3 N4 S" [matlab代码:- >> clear all
+ D: @/ R4 S& C# P# x - f=@(x)x+1;( C0 O' M+ U. K) C/ ]' ]' A& o9 j
- a = linspace(2,2,1000);
5 x9 [+ C5 v, A, i7 T# N - tic/ B1 s% ~4 ~% `5 l: P& M
- s=0;% P, t4 V: J' ^+ c# ]: R5 @
- for k=1:1000
0 Z, r8 `3 q, J) L7 s - for i=1:1000/ k* V. _4 K* A* ]7 E
- 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/ O9 R\" G/ T$ O {
- end
\" d+ ^9 i* _- }) v# \4 d4 G - end
3 f9 ~+ C' T! ~' N% G8 }7 u - s\" O! c% q7 }' w- S3 K
- toc
/ Q6 O4 N [$ D1 d% i) S - 1 O1 ^& Y. ~$ G5 C; t% c
- s =
# \& i( l/ N' P z) P. A - / F G' j: G6 G+ o\" H$ J# N
- 2.4002e+007
6 `- | B4 t6 S
( N2 Z) X7 E\" b- K2 R4 T5 k- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];' e1 ^; K) T- @
- mvar:0 \ |/ I/ S8 @$ G( }; A% t1 d
- f(x)=x+1;5 F1 |. y7 d9 G: j% S
- main0(::a)=) j$ E' U; H) B2 e* R. @
- a = linspace(2,2,1000),
- 8 d# W\\" }6 N$ B% y. y& V. L\\" B8 D
- t0=clock(), s=0,
- / ]! w+ q# o6 l0 R! c7 W
- k=0, while{k<1000,4 g3 h. t# \ f# K' }/ D) N3 C n
- 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++},
- 2 l/ X\\" k/ P( a { a$ w
- k++! p3 c0 h9 C1 T6 r5 W& }5 _
- },
- $ s+ [2 j0 Y\\" V4 D
- s;
- 1 I N8 B5 ]4 F- {/ H
- [clock()-t0]/1000;
结果:
9 E0 Z0 E7 U4 @* h: v1 A' x24002271.69189384# @( ~% N( q5 n. Q8 c
5.1726 A6 {9 b6 s& w- _ a- l+ X# w2 _6 Z
3 }6 @% Y- r* f4 S, x& s, t# `. G
二者效率现在只有一倍差距。
- o, P; V7 T- Y) Q
$ d; ]$ u$ C1 v" R----------
, \; l4 e3 Z: f6 v, H; n: \8 K4 e+ s: M$ K, J0 F& n
不过,显然matlab和Forcal的程序应该这样写:
3 `- N; N5 d5 ?7 r: Z5 p5 X
' k. N8 y B# ~7 M" smatlab程序:- clear all; G0 p U$ X# G; M/ J
- f=@(x)x+1;/ a' v4 @; c\" T) u
- a = linspace(2,2,1000);
! U: g* n7 ]\" }7 @ - tic; B/ f+ t( C5 y9 @8 f9 P; a) c. f
- s=0;
( w0 X, t0 W! P# f - for k=1:1000 f; f5 m0 K; }
- for i=1:10007 m8 ]3 D/ c& _- q& S% s! j: h
- t=a(i);
$ S3 S7 A& Q/ B - 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);9 ^: Q0 s) ^; }0 X/ J7 \$ u$ f9 `
- end
# x d3 S5 v\" a - end
, D ?: h, l+ ?2 M7 i - s$ A- ~1 s3 I6 Z- N {$ z/ r' y
- toc1 b0 Y- k& s: U' N\" t
- ) {; X6 R9 O- ?+ |
- s =; J( N0 n) v) S9 U. u
- . B. u9 j! O9 ?8 i
- 2.4002e+007
, c6 i0 P. j( m - & g5 ?/ d2 s ]' w5 [ q
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- 9 L3 ^, w) V& W4 M! [( r+ a7 B
- mvar:$ F4 o- ?1 K; }* K9 d0 O7 A9 @' }
- f(x)=x+1;9 y' |4 P4 b9 f\\" W ~
- main0(::a)=/ o1 d/ V2 s. |
- a = linspace(2,2,1000),% i9 I( \0 t+ _3 Z
- t0=clock(), s=0,
- 0 s/ G( i+ t' L5 Y
- k=0, while{k<1000,; g- ^\\" s( }5 O% @, i9 p
- 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++},
- - M1 p, C1 V2 U. \( N3 x0 f% I8 ^
- k++
- D6 R$ R$ I |2 O
- },
- / O. [\\" x, c- {4 G& x
- s;\\" G& L8 v5 a6 X0 `, g
- [clock()-t0]/1000;
结果:
$ Z7 a" l @( G3 y: W5 T24002271.69189384
% t1 H: e& W& f9 u# Q4 _1.625. u' I9 H; `9 v& D
2 Z) W* c1 F6 j/ W: n1 d
matlab效率已不及Forcal。8 x/ b- G& n: t- f% s5 R
6 ^/ h! x2 K- d+ f Q. W
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|