- 在线时间
- 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的数组存取效率非常高
9 I" M; x: g# Z
/ O& Z: K( W) e) x& C. K7 B4 r) SMatlab代码:- >> clear all% j' z8 E9 w T
- a = linspace(1,1,1000);
/ W$ [ f5 h+ e\" E - tic( d- r7 P. U/ [
- for k=1:100004 s8 F% O\" q' V3 u: d\" K! X
- for i=1:1000
4 Q\" T6 t- ^\" M5 j; E( N - a(i)=2;
, V2 N, n$ A7 M - end$ W2 s3 }+ x q, q7 @
- end6 ^3 q$ N. g3 ]$ S r/ C; E3 b
- toc
9 J! S9 |2 X9 v - ' l3 K, O! A$ @* x% d! v
- tic\" G: I% L% k6 p+ S6 I& T
- s=0;# g1 v% z: D; }9 V* w: F6 `
- for k=1:10000\" T U; @4 ~1 C v
- for i=1:10008 r, Z4 O/ x- [9 Z% X2 U* w
- s=s+a(i);
. Y9 [7 g4 _. D* Y& O& H& I& A1 y - end\" W5 a2 ^( q1 }$ D) e2 |1 h' r
- end
2 i8 l9 g$ P6 W, E\" R\" h - s
# a( I1 s$ }7 I4 k, J4 _4 Z* ` - toc
) i- V\" j\" U% o8 B - Elapsed time is 0.140658 seconds.2 g2 U- J) D+ c ?9 [1 O5 x
- l7 Y3 m+ b1 z+ S- s =
9 ^7 c; A) n\" x* J
0 V4 M) x( \6 K- 20000000
\" a! u! ^& X4 A
8 [( Z+ p7 o2 g7 W- Elapsed time is 0.091794 seconds.
复制代码 ============
4 S3 x6 j8 m: b5 S, C7 Z& \: ?: u& R% L- w
Forcal代码: - !using["math","sys"];
- ) U. x\\" Y5 ^5 I! ]: G
- mvar:2 ?. h3 M; L& m
- main0(::a)=
- , @; q2 m6 o9 h' k' C
- a = linspace(1,1,1000),
- 3 B2 p' s/ T0 ?4 ]3 [4 @
- t0=clock(),
- : n; \# P3 }$ [+ G\\" S
- k=0, while{k<10000,3 y3 J$ y' C9 \
- i=0, while{i<1000, a(i)=2, i++},\\" S( [- W5 S) m; U( i% Y
- k++% J' Z4 e' H# o4 h4 \
- },
- \\" P9 ?! Y$ K# h/ e
- [clock()-t0]/1000;9 A/ I9 P& U- Q3 V. X\\" ^1 y3 |' R
- 2 G0 B2 g0 q; |2 J$ X f
- main1(::a)=- O7 y2 E, I7 z/ c& S
- t0=clock(), s=0,
- g; w8 e1 h' ~7 i g\\" y( h
- k=0, while{k<10000,
- # H, r# a# s\\" }2 d5 f0 T
- i=0, while{i<1000, s=s+a(i), i++},. P/ R; \% T. s2 W+ e# C
- k++
- % q- y9 C t8 }$ C
- },
- ' d Q) Z, f9 ^' W8 ~3 o- ~! A
- s;0 b; }2 R% Z1 {
- [clock()-t0]/1000;
结果:
. O; `. p* B* z15.484 //存数据所用时间,秒6 i) s; ~0 Q: s! [+ ^; x H. H' a
20000000.
, h9 D3 L) j7 k" a8 Q5.531 //取数据所用时间,秒; [ t7 t& x5 f* u4 `
" c: f9 B4 f5 s# \4 C- o9 u2 e
----------
. {# j. Q% d5 T# {5 L/ V$ M
6 Y) M1 T3 H9 x用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- ) W: l0 O\\" U/ N8 F
- mvar:
- 4 K+ C1 _& I# `
- main0(::a)=
- / z/ t1 i$ p1 _- v4 T. ], {
- a = linspace(1,1,1000),' N- d u T4 `) Y, A6 K$ p. o
- t0=clock(),0 y! X. R% F5 w4 T p\\" \6 Z
- k=0, while{k<10000,
- 6 V% e0 N0 |5 A\\" w& M% x
- i=0, while{i<1000, A(a,i)=2, i++},+ V$ i$ e* E7 H! ^
- k++
- ) l i$ M8 o u7 q
- },
- ' d/ F8 Z4 F: N0 _
- [clock()-t0]/1000;* x5 }. b5 }7 h
- ( s/ v2 o/ ~& L- T\\" L K
- main1(::a)=# n* r+ M7 R5 f% F! s\\" e
- t0=clock(), s=0,' P2 Z\\" H: ~0 T5 ]6 l
- k=0, while{k<10000,
- % C. p& z4 ?7 ]+ U
- i=0, while{i<1000, s=s+A(a,i), i++},
- ' T- _* s+ [5 I/ o
- k++
- 4 q/ ]% j% K: s Y4 R \9 S- R
- },; B9 X8 x* s; p0 ?
- s;/ D `$ H2 I3 l B% u3 G* a6 t
- [clock()-t0]/1000;
结果:
! ]" p% J. f8 h2 g0 \10.469
" p2 l2 q& A3 r( \: h# l20000000.
" ~0 t* x- S) J" L$ G- s |, e1 J3.7815 I6 l8 h2 x! ^: b7 H! [6 d8 k6 p+ v
0 \5 E4 Z+ A% P U
-------1 ^! _5 r$ p. F5 A
; R. r/ U# G) n: \
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。. D" O, n' [. k% ]* {
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
; p( Q4 c" D& v. J( R! n. x/ A1 [
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
- e# {0 s5 {) q/ ^7 n; U, d6 W# B$ b
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。0 c8 L4 L: j+ a3 h/ `6 M$ f
4 r0 H5 |$ {3 H- R5 n5 `5、在循环中加点东西3 s- P1 s: B7 g9 p+ M5 t
( R. `% ^" a& j5 N8 ^: mmatlab代码:- >> clear all% _4 k0 d\" v, K! I: L) @' I
- f=@(x)x+1;
' ^, |/ a/ F5 {( F - a = linspace(2,2,1000);
+ T' G. x2 H\" ?) X: d - tic/ N! b) w7 ^4 p1 k
- s=0;
: g\" W7 G8 B\" f+ r/ u* h( j - for k=1:1000# k3 s0 P% n) I P( ]& i% C
- for i=1:10009 Z9 h# }1 ~# `: a2 j. g$ R9 G
- 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));6 B) K! E0 A; ^8 W
- end
9 K% w% H0 P6 a9 G' r - end7 K% H- @ H, H. J% H
- s* G( J0 R+ y! J\" J: c. Z' J\" w5 O
- toc
$ E G\" \* ~4 D6 F4 B0 ?. v - F! I+ d# N; S$ K& n |
- s =- m% k: g5 Z8 q. {& p& g: ?
8 N* E! f1 ]1 n1 a- 2.4002e+007
5 e Q4 j/ W- } - ( Q: G* k2 S/ }3 e6 c/ A& c5 P' [
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"]; x1 x7 [& D( |* R\\" H- e( O
- mvar:
- # t) W2 b3 T! J3 H R$ y
- f(x)=x+1;9 B- {8 r& H6 G$ v/ M
- main0(::a)=' D h5 s8 H: Z( L
- a = linspace(2,2,1000),
- 8 p1 q p( |( r* m
- t0=clock(), s=0,
- / J: w8 ]+ ]* T- t7 F: f
- k=0, while{k<1000,, y6 t5 S5 w+ v9 V\\" H\\" f6 j 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++},0 J6 H$ L# y! X) N: e
- k++
- \\" o! h9 X z9 m) f; V( d
- },2 B, O, E/ o: N# Z
- s;1 u1 u, B6 I8 ~; b* e; d7 t. A
- [clock()-t0]/1000;
结果:0 [6 B( A' y4 V; L2 b
24002271.69189384
8 ^% T0 L( x' @: q6 V$ P" W5.172 ?* j2 E9 T0 z ~7 T& b4 Z
7 V8 }& b9 i+ }# O7 I
二者效率现在只有一倍差距。9 p( o' A9 J ~% n5 R& O
* ], I7 T' B l* }----------
6 L+ u. p! w& P/ N9 m9 p. s8 ~- w" |0 z% A( |
不过,显然matlab和Forcal的程序应该这样写:
+ d# Y# u% G/ ~- P! J1 S; ?, j1 {& r- _9 T8 t3 Z% g8 w2 {. r
matlab程序:- clear all
* I. _8 K# {3 t - f=@(x)x+1;
; x3 Y; I& a, z$ F) s( @% b& d6 h - a = linspace(2,2,1000);. i7 T8 t0 Q3 L$ V
- tic, e r) l6 Z0 ^9 y' r/ a4 \
- s=0;
5 ^ Y( F+ c9 \7 v1 Y- o - for k=1:10009 i3 c7 t6 ]& d {+ _
- for i=1:1000( j6 @) b( _1 e; {
- t=a(i);
0 v; m7 X: F+ ^5 P- d - 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);
5 p1 |/ R5 V- |5 F; N& O - end- A d+ f2 i0 R) q- x0 w* g, b
- end4 u4 M/ O: E9 j; O6 J
- s
* d$ U7 I8 | Q, E - toc
0 B! @5 N\" m1 J+ @3 h u - 1 P8 ?; F! }\" J2 r
- s =
& \3 B) F- M' y# a\" I& X* ^8 _ - 5 `0 d1 W+ y9 N1 S7 Z/ j
- 2.4002e+007
) a. K, l! X$ n$ I% R - 4 o5 w/ ~- `3 F8 B
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];5 i3 s% C7 @3 h, e, r. ]
- mvar:
- ! @\\" j3 j! V1 C7 g+ W) A
- f(x)=x+1;\\" k( b8 L& D* q: @ x7 e9 f
- main0(::a)=
- 9 c% Y* m7 r$ J1 ] ~9 m
- a = linspace(2,2,1000),( }' m5 f: X+ w5 w
- t0=clock(), s=0,
- 8 g% Y# z# c* Y0 M
- k=0, while{k<1000,1 C1 K* Y6 |/ C3 w+ q' q8 u
- 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 j+ I4 r& D5 R& S. E U
- k++( w* M# D, x/ {& `3 D
- },
- # e5 x/ d, a+ v2 @
- s;
- + ~. ?\\" M5 W& e0 M$ p F
- [clock()-t0]/1000;
结果:
# |( P5 }4 N$ k- G24002271.69189384
: r7 P& ~7 L6 Q( p+ a5 }1.625/ e. q) U2 e3 Y0 m# l' z- `/ i
% m' `( W7 ~# t) H. K
matlab效率已不及Forcal。" k! b+ A" w+ T' m" y, D% L
9 G( T# P' X, V" t; S提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|