- 在线时间
- 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的数组存取效率非常高% ]" @* I7 _6 n4 k6 b( J
' V/ v5 ], |5 W: u* ]Matlab代码:- >> clear all
8 U, y0 V! \% T$ g+ Y6 F - a = linspace(1,1,1000);
. [/ o4 m! Z/ V |4 y* _ - tic
3 O7 w' ^5 Y; q3 L& U5 a - for k=1:10000
) l8 B2 n9 m, r4 n9 c1 ~ - for i=1:1000
\" o3 Z. S' c z\" J6 m: q - a(i)=2;
5 c6 R H# _2 Z# G. Y - end4 o9 H! [( S) @4 Q
- end
; I4 c# s# B3 k( Q - toc
6 x\" L' O9 Q# q1 A6 R2 g4 V - ) \\" P4 q. e5 _\" ^
- tic/ L' b( M5 ~6 G( E1 y8 P2 I0 ^! C
- s=0;5 t8 i( d$ ~ [* R' L; y* ]
- for k=1:10000
# ]6 Q\" _7 o' K+ a E - for i=1:1000
( n/ v# Y. X2 ^) I7 F - s=s+a(i);% M8 S8 E( t9 D0 _$ r, p) J
- end' p$ s, q% K2 G2 J8 {
- end
/ Q( I% @1 _/ W) A - s
f\" ?( b. o3 J9 J2 ? - toc# _: l2 k4 S' F) s
- Elapsed time is 0.140658 seconds.
0 E5 N0 d6 s0 V i/ P! J
' _\" U* q+ y! q3 ^- s =
& c9 E+ e# P\" b; B4 v. u
/ ]3 b$ n2 |8 k- 20000000 J: j4 P: d; m: p4 k
- d! c4 w3 b q Z- Elapsed time is 0.091794 seconds.
复制代码 ============, O( r# ~3 e, E$ S
, E- C; G% V* j8 G$ UForcal代码: - !using["math","sys"];
- \\" E/ U\\" \' e; q, c
- mvar:$ N! F1 h# @* L& {* M8 f0 s
- main0(::a)=& \! ~* H/ U/ i; z! `4 D3 o7 P
- a = linspace(1,1,1000),
- \\" W2 c. j; g0 P$ a5 v% {
- t0=clock(),+ ?# k+ v5 W' f2 R
- k=0, while{k<10000,\\" n$ E0 Z\\" u8 r, b\\" Y' k+ \# [
- i=0, while{i<1000, a(i)=2, i++},
- 6 V\\" H& g$ G9 V n# u2 ~! C7 W- p
- k++! R# F5 \& `, W! ~\\" v4 e\\" u8 I; ]
- },# ?( ~. g! S% v' [; U0 g
- [clock()-t0]/1000;
- * Z- l6 l' ?7 c& Q b) N
- 2 e0 C2 ]8 w$ i0 m
- main1(::a)=# Y7 H S7 X9 x! g( z! \\\" D# b
- t0=clock(), s=0,
- 4 s% f\\" k\\" K5 S ]2 p2 Q8 }) m
- k=0, while{k<10000,, B7 V* e/ I& @
- i=0, while{i<1000, s=s+a(i), i++},5 m+ h4 {/ C% w8 \6 v0 X
- k++
- 8 D8 t1 ]/ Y9 W! Q, Y; N
- },8 t) W5 q5 G. V; Y2 D
- s;/ a$ _; a: M4 G# A$ ~% w
- [clock()-t0]/1000;
结果:: z' i* i8 q8 ?- ?& p
15.484 //存数据所用时间,秒; Q4 i$ f4 M, R. z% [
20000000.7 z# J Z* t6 y; O+ f7 ~5 s- t
5.531 //取数据所用时间,秒5 Y% j, ?5 n( E7 W9 k1 v$ I7 U
; A( L5 `$ \9 k
----------: _( d0 D9 T; k- {5 f% b7 q4 ~
: c* w5 m" p, Z1 b+ Z: m9 e& K
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- ! |+ w3 \8 y\\" F\\" A8 d, o
- mvar:
- - w# H) i\\" K! t& Z# N1 W
- main0(::a)=
- ; D' B$ U+ z6 e1 @& o, N
- a = linspace(1,1,1000),
- 5 R7 r- A* O5 j% c( Q5 @! _
- t0=clock(),
- h, }' k) g7 v( h% c o
- k=0, while{k<10000,% S! H( O3 v$ ?\\" f$ R0 }( A
- i=0, while{i<1000, A(a,i)=2, i++}, X6 x% e# @+ w* o
- k++' a8 {; f\\" c- S* e0 _
- },
- . r\\" t1 K9 ?: ]+ L, X4 E2 o
- [clock()-t0]/1000;0 F6 I+ ?4 W6 r6 Y& d8 q
- ! O: N7 h# r& G- c; Z5 J\\" a7 [) M# M
- main1(::a)=2 V& d) t! n5 d5 t% v
- t0=clock(), s=0,8 T/ l2 W/ W! s) q3 j$ g
- k=0, while{k<10000,
- ; u7 g2 {\\" Z! u$ x. T/ d
- i=0, while{i<1000, s=s+A(a,i), i++},
- $ M2 F& E# `6 ^2 S, p: L9 h
- k++' c( \\\" R+ v& E3 L# l7 v
- },! w* k c# O7 z
- s;
- & {\\" @3 j% Q$ z9 q\\" {
- [clock()-t0]/1000;
结果:2 x1 F3 A* V' o) F( U. S& C
10.469
. w! Y) |, @( b" N% ~20000000.
5 v ?$ f7 s) J0 h( |% d3.781$ O% \; L6 y! j% b
' W$ \$ d# s: w1 v7 U$ u' a/ r2 O
-------- U+ v& e: C+ H. n( h' ^: g2 A2 g% S
) n* N) }+ G" `7 u" x
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
/ j# |* Z8 A% I, u在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
& \$ {! q; q5 _' h3 J1 q9 q. P3 m) |) r3 Q
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
; y, _' }* r) y+ n% l$ X7 ]6 B
1 Z, O; z }2 {0 W. VForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。. `; v, m/ U, F9 }
/ ^* \8 S" s. h1 r' m+ v5、在循环中加点东西* q: \3 ?2 c, G+ K6 K3 V" B
) \) R) t3 O6 k/ b0 a
matlab代码:- >> clear all
2 g8 S! N5 t+ A+ N; W6 K: w - f=@(x)x+1;
; {9 g Q; n- ~$ A& L4 C4 l - a = linspace(2,2,1000);
1 t/ U' b+ }/ u; C - tic
' ^# p9 F4 M/ b5 K# s2 [0 }6 |5 \! r - s=0;
, C) y; [) i' m+ l9 k2 j: A( r# T( { - for k=1:1000
( b, |1 s3 M& ]. X6 ^ - for i=1:1000
% P Y* `. I3 r% b! q3 H - 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));8 V5 a, x, w3 Z. ?- `5 n$ N
- end6 T/ p# \4 L% f# y
- end
3 {4 t( `7 f0 z4 |* U: N - s
# f5 W4 d) U1 r9 _4 n5 t( e - toc+ w7 W- h) a$ ~! u% G' ^* b
- / n9 V+ i! u$ l3 R% \
- s =% M' Y/ F$ G0 U5 _6 U
- 4 X6 K+ U; x. R7 e2 p
- 2.4002e+0070 B' h( p+ R' t9 S) @* n* ]
- : S9 e$ _8 S, l) S! W
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];1 `/ t: G; y E
- mvar:
- & e: _\\" c$ x* [. s
- f(x)=x+1;
- . m7 h% X$ R0 o& \+ m% ]
- main0(::a)=* M; d$ p, j& G; @, n3 b. _% g
- a = linspace(2,2,1000),
- 2 j0 j( q. y+ |4 W1 h
- t0=clock(), s=0,
- $ i* r; v8 w5 _; i( K; ]! ]
- k=0, while{k<1000,
- - I5 T8 n1 `4 [0 M1 m; 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++},: o1 c* y- q4 A/ Y2 s. v
- k++/ l; [1 w5 b$ x, ~9 ~) {; f
- },: O ?3 V\\" Q: w( w0 Q$ d
- s;' I0 }7 Q* i# m9 ~+ ]3 p3 r
- [clock()-t0]/1000;
结果:
2 U$ M6 Q/ {. D4 Q24002271.69189384
' e9 M3 ?* L5 x# o& P. \5.1722 B. E0 \ z7 m: X+ a
5 {" w: N' }4 f
二者效率现在只有一倍差距。* n5 o% d: x' u" }* a
+ Q+ M) k3 h8 _$ a8 S----------% t7 u S; x( T6 }3 b
( t: _8 D& Z2 ~) x不过,显然matlab和Forcal的程序应该这样写:) L8 L9 F& E- X* G& }5 t- M% N
/ c0 H1 x: n4 R
matlab程序:- clear all
3 L; |8 Y9 R' D9 P6 L0 f - f=@(x)x+1;
+ y' G0 @8 ]2 `' E3 A2 Q0 g3 R - a = linspace(2,2,1000);6 p$ N/ z# o0 h/ h) X
- tic
* [/ P4 a. q( [1 a# ?3 x - s=0;
) D+ C- e1 ~1 y% V% E - for k=1:1000
\" j3 X5 B4 U6 L - for i=1:10007 B$ ~& J }3 ?# b$ |' t) f7 x+ {! `9 W
- t=a(i);0 ]/ l6 K. M: R9 [
- 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);
$ ~+ Q# C+ E# U - end4 F8 j! _4 u. j; q! {$ | `
- end# Q& Y# W2 b$ R
- s+ N; n* O4 ~8 z, R& @8 U: K
- toc- A: L5 W/ T; g; |
: M3 \ v9 d0 h- s =2 x8 A2 ?# @3 Y% Q4 c
- 5 }' W+ l5 Q0 L# k, y
- 2.4002e+0073 G1 |1 c! v- T8 c3 @1 _
- $ k; j) C0 g% \. K3 Z
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- ' K0 O U\\" R4 E+ J4 e( Y e
- mvar:
- $ m( i. S }9 v# x
- f(x)=x+1;
- 2 z k/ ]+ v$ A$ R# t2 N7 ]
- main0(::a)=. U8 S3 _) v7 P- T
- a = linspace(2,2,1000),
- / Q( v! N2 L* `& I) B
- t0=clock(), s=0,8 ]& r+ U, f' n) B( n# \
- k=0, while{k<1000,
- ! B' Q/ M( J O
- 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++},; w; _4 @4 r2 [8 B5 V+ Y
- k++
- ; ]4 r9 D* M( w. v! M! K. a5 Q$ C
- },+ l' D3 @2 v\\" F& }& A\\" _
- s;8 @8 x\\" g, p) \0 A) k8 i' {/ R
- [clock()-t0]/1000;
结果:
4 G* G) r8 {% R% O4 g' b9 |24002271.69189384! \/ ^/ a1 {4 k# E) z* f
1.625
% _- x2 d) _# h" c' [7 K3 T5 ?9 L8 ]' C- F" h
matlab效率已不及Forcal。
0 z/ O( G; n8 K+ }4 a
7 }9 x5 @$ R' h( }" T( i提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|