- 在线时间
- 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的数组存取效率非常高
- }4 ~$ [6 Y- D. D8 _# x) W# R) j5 X( Y; M
Matlab代码:- >> clear all
, O) }; s( d3 [% a& @ - a = linspace(1,1,1000);' p, w y# n; x% N# R
- tic
5 |5 l' Z& P# | X9 H3 T2 l: M\" K6 B# d - for k=1:100003 m3 n* ?, y5 ?4 m5 \, N; ]7 A
- for i=1:1000& F\" `! j5 T! Y4 v4 x
- a(i)=2;. ^# z# k) ^9 J1 b; G. V( U: u
- end
p1 V3 Z+ m/ @& i5 _\" R - end6 Z: k8 z+ i9 u0 J3 C7 V\" k
- toc
& t- S( p- F\" s6 E! g' q+ w - : M: j7 _$ H* I0 b: h
- tic
$ \8 t0 _9 y d/ z- D - s=0;( c) ~8 c6 q: r* \) W7 Z, _
- for k=1:100007 ?6 s, H. o9 x9 M! s
- for i=1:1000
1 o8 ` v3 x* X. [\" s\" R - s=s+a(i);
+ S, s' p5 a: P% N/ s- m9 U - end* O+ i0 g: x P0 Q6 z: X
- end- R8 S' q* Q' C% b2 H* s* U$ U- N
- s
* U7 D+ h/ o0 N- Q1 ^: E- m4 v - toc, o. A. n( C8 t5 i
- Elapsed time is 0.140658 seconds.\" h9 w3 L, t# F, s- G
# k8 f. ?: Z2 ~6 P% {- s =: _( U' L/ d\" S8 J4 n1 {% B: Z
- o1 u4 W2 G& d- 20000000
+ f. g0 l* z8 a& {% E# Y
0 m6 T, z! G, t- Elapsed time is 0.091794 seconds.
复制代码 ============
4 d5 ^/ R9 O% o: F0 s% W- d
- a- i- C3 \( i; G/ qForcal代码: - !using["math","sys"];
- ' ~1 t7 W' c6 m2 r% R3 D( k% O8 J
- mvar:
- ' T$ V3 M8 M. o7 K( Q
- main0(::a)=
- 0 I* o! D: A0 H9 v\\" j( |
- a = linspace(1,1,1000),
- & q( j9 x4 T# F
- t0=clock(),- x$ n* u0 M9 M# f/ Q( H9 z3 |
- k=0, while{k<10000,. Y. P2 J9 N6 F+ o% O3 ~\\" G- g
- i=0, while{i<1000, a(i)=2, i++},
- 3 A! V8 k0 C$ M( K
- k++8 H: r7 F. u2 J' J& y& X* Z3 c4 o
- },/ f4 O* ]7 i/ G7 G2 {
- [clock()-t0]/1000;0 o& _+ E\\" V\\" N% L; M
- & m: x8 A\\" b; L\\" K6 |$ i
- main1(::a)=
- 7 W5 f$ b2 n! O$ c3 P
- t0=clock(), s=0,
- # A) {. R1 J: c) c* z2 |
- k=0, while{k<10000,' U4 y# Y! G4 u% Y+ {
- i=0, while{i<1000, s=s+a(i), i++},\\" K9 p7 v$ B* K& S
- k++
- 8 ~) q+ d- ^. b+ J# }2 V( n
- },& F8 j9 P7 o/ V3 I
- s;
- 3 x! F- Q+ Z' ~7 t$ l) i
- [clock()-t0]/1000;
结果:
* ]' J; N' B7 N6 s15.484 //存数据所用时间,秒
1 }0 T0 u6 W9 @+ b( r1 e20000000.5 [- J1 m3 J$ }+ c
5.531 //取数据所用时间,秒
0 H( d7 e8 a9 V, v
. N5 g; p, I9 g9 q----------4 K z+ P4 i, J& Z, W
' j s5 l2 g9 x用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];- B4 B- I8 d/ V( ~9 |\\" |
- mvar:
- ' U3 [6 u5 z5 W3 O
- main0(::a)=
- # ]& p; o2 ]' h1 e) E% M, m H
- a = linspace(1,1,1000),
- - l9 _& c0 Z. k# A M
- t0=clock(),
- , e- `. g: u7 Y2 D; Q) i; v. C
- k=0, while{k<10000,7 m. }! t\\" V d* `
- i=0, while{i<1000, A(a,i)=2, i++},
- 3 `0 L5 P5 g* |6 a2 Y: Y
- k++
- 5 p3 S\\" n9 J( n' {8 I, ]0 V
- },0 W+ p4 r& k' D
- [clock()-t0]/1000;
- & B2 r7 X& E& E, r) g& y
- 8 S7 M$ o8 i$ ]: N3 P: H1 K
- main1(::a)=
- % X* |: i2 ^\\" G# K8 w
- t0=clock(), s=0,5 Y, i3 G C' L5 I( h% }
- k=0, while{k<10000,4 S9 Q\\" [; q& O) M2 a0 w n- W
- i=0, while{i<1000, s=s+A(a,i), i++},
- 7 ` T1 z) c ~
- k++* q9 i+ f4 m. G5 _( f
- },+ S5 W8 k\\" P3 j$ ^9 S! A4 \
- s;
- 0 h! z0 Z4 z\\" e\\" r6 x\\" Z# b5 d
- [clock()-t0]/1000;
结果:
9 q0 ]3 F/ C1 b; w8 K# [10.469( L2 t& i; L1 [, _9 @8 r
20000000.
1 m# s+ N% z; b3.781
9 \$ @$ o [1 O. a, O( z; Z
. c& G9 C1 ]) S5 `' u2 r; I-------
4 W& w. _3 I+ \+ d! E0 ?! ?: n9 o; B% C' F
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。) [- d& q, K8 Y- S* c
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
# G: u% p* z B+ B1 `6 C, a) n* Z( u# J% N
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。4 z9 @$ E, Y( v6 _0 H( r* C" T' ~& I4 W
2 m$ `. a& H) {6 k# K: m% Q
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。: {: P* k7 @$ V3 ]1 k5 K
& E; r' k% A+ r9 k' O" v) o$ y" C
5、在循环中加点东西8 @9 D; B& M s7 C
* t9 w' `8 F9 y& o+ F. w8 H; |
matlab代码:- >> clear all
N7 t4 U: e: {9 `( B0 ^- } - f=@(x)x+1;
& W2 w\" {2 }9 Y) V3 q0 N - a = linspace(2,2,1000);9 n) E, s3 e8 d5 J) R5 I# J5 R4 Z
- tic( g. G7 q( t) m7 X# t% L+ W! y
- s=0;
' c; E* k# b- o- Y1 l- v: t - for k=1:1000
* Y4 D) |\" p' ] - for i=1:1000& K3 L$ n: w& I l6 }. 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));/ J2 @! Q! n/ f5 Y, [
- end
. v4 D8 H7 n% E3 E - end7 [( M$ k0 q$ H7 D
- s\" j) l6 G4 d; m- d
- toc) E! K# o8 G\" c8 O' ?8 o% s
- \7 [\" Y8 V, N# P- s =
! M; {6 \8 C* N9 U - 0 W/ E4 |. o' C7 {
- 2.4002e+0079 K9 P9 q [/ k! N' c5 O
: m% q! |6 U( A- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];
- / t2 y8 t2 Z8 i% E, P3 {* l! e
- mvar:
- ( y1 K/ ?0 c\\" U
- f(x)=x+1;0 S2 I; |2 l9 R6 h\\" {& R
- main0(::a)=
- $ y5 P2 T- K8 o' s# }
- a = linspace(2,2,1000),
- 6 C C6 J3 k5 E# |2 T$ ~( G
- t0=clock(), s=0,
- 5 ?7 P( q9 i f/ z0 M! w- E
- k=0, while{k<1000,
- 6 U6 e% K+ U; y5 x) S\\" [
- 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++},4 B A& t' f0 F, H# I
- k++: |/ b& A T1 q4 K% [. x
- },
- \\" L! P% `( ~! p/ x
- s;
- ' r8 j' y) g V% |$ S+ {& Z
- [clock()-t0]/1000;
结果:% ]" L. i7 d/ Q! x- k3 `" |( d
24002271.69189384! |2 I' a' w0 p( l5 n& F
5.172
9 s& c. B; A6 X# B) s) y9 U# N& U1 [$ g
二者效率现在只有一倍差距。% W0 @* l. x" l1 y2 R$ [
7 S9 D( t2 n' N& i6 }
----------5 e1 `) K# G9 `* h( \
% c6 ]: T, F1 M2 N& b; m
不过,显然matlab和Forcal的程序应该这样写:' ?5 U& l& _7 H+ I
. ?( z& B6 O' N5 q* |! pmatlab程序:- clear all
+ A/ y9 r( K* v - f=@(x)x+1;
4 s! J- m; G3 x1 m- t7 C - a = linspace(2,2,1000);
; t. R; U4 o4 C3 D! } - tic
7 P4 _, B' q3 N7 `( t2 X m: I9 ^5 o - s=0;
8 i- b. A) A/ A) |. r - for k=1:10008 C3 ]2 z* f K4 `2 C6 `+ c/ I- E
- for i=1:1000
! d4 x5 w; _- [* m/ T# O9 R5 _ - t=a(i);+ O0 Q5 j( ?5 B5 g/ h
- 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);4 L) y\" _+ i8 W g
- end4 W. {. `6 H) a, U, z
- end\" D( Z$ t& p8 ~+ M, A+ _
- s
. i. ~9 H7 G; g* p( y2 @ l5 b - toc
\" `2 Q _3 g1 C- b - 5 M) Q; ^1 E1 W\" {. v/ m
- s =0 V; m' D }- M! U6 p( I' H
; R/ H i$ Z+ ~( E, _. t0 c- 2.4002e+007
' _+ Z0 [. c2 v2 Q! ?( q2 } - : X9 w; z/ S0 d
- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];$ s- H- t( j8 f4 z Q
- mvar:+ m! ~2 Q0 W4 b\\" p( J
- f(x)=x+1;
- ! y$ A; i) t; u* E
- main0(::a)=
- 4 \7 o* I5 \6 v! n- k- u( |
- a = linspace(2,2,1000),
- 8 v, L$ G# E; P, Z# b2 D7 t; g- }
- t0=clock(), s=0,
- $ j2 M. y. E9 `5 M* J
- k=0, while{k<1000,) ~\\" O3 ~( P1 c' G, k\\" L! ?
- 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++},
- / {4 x* @- V2 {
- k++
- % q' h8 Y( T) ^( [9 `$ ~
- },
- # d& O6 L! e1 R: q
- s;. V g% l8 t5 P8 D& O# b7 T
- [clock()-t0]/1000;
结果:
+ O$ }3 E) E, E3 n1 _24002271.691893844 P+ c* Y# }6 Y, m3 @0 f
1.625( |; A' s3 q& D2 v) R$ a5 S& ~
x' P5 ~2 T& U
matlab效率已不及Forcal。
( w# I9 E, w* H& E* L" `" H5 }; p" ~8 C
/ Y0 q- O7 Z/ t3 Y提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|