- 在线时间
- 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的数组存取效率非常高
/ A( ^7 r. C- Q; V2 K. b! F" f9 F' ?$ A: a
Matlab代码:- >> clear all
+ f! D- A. o0 M: y - a = linspace(1,1,1000);5 o3 F3 L- w: D/ `\" T
- tic\" H) g O& U\" C
- for k=1:10000
* Q4 f j, D5 J5 j6 d0 t - for i=1:1000% y) s9 i8 q! o6 N7 g4 f8 a
- a(i)=2;) D\" K0 e6 y5 J\" P9 e
- end: {# w6 a3 D6 i k0 l7 z3 f* H( [
- end2 G# V1 G& a5 G
- toc
}* _2 D' {6 s2 T% X - * U5 o! {1 V/ y6 g\" T# ]6 l- P
- tic
8 G0 `; d8 A0 H0 f8 p - s=0;
( `* ]% j. L0 ^4 M A - for k=1:10000
0 q: X z7 s$ L, l; O/ U$ d - for i=1:10000 T( e4 j* o/ T# f. @% d
- s=s+a(i);/ B, Q n9 \# n\" C! L1 G4 n
- end
) T! Q7 @& r) @0 k\" e: m; i - end5 p l- S7 Q! O4 ~5 F
- s
3 n! V+ B1 K* f* Q9 `3 V2 _ - toc
3 @1 I7 S# [4 U* t; _/ B, c$ z - Elapsed time is 0.140658 seconds.
l6 Y5 Q' W9 h) B6 F4 t s - 0 F5 [: s6 |/ i' Z\" u% V2 b9 q
- s =( K0 y+ h- o' R T5 o$ o
5 l8 a4 x; x0 n, ^& n0 `1 } N- 20000000
# j% {\" e) d' E {/ \
6 h0 ~# d( h; y& G4 C0 v- Elapsed time is 0.091794 seconds.
复制代码 ============
4 }" r) u' H; K8 ]9 L3 U* J- F3 m" a$ ]* \
Forcal代码: - !using["math","sys"];
- # v. n) f s\\" |6 ?; B5 L9 v
- mvar:
- % f+ f+ r' @+ H5 O# M
- main0(::a)=
- / J) N# W5 `9 e u2 U! C\\" P
- a = linspace(1,1,1000),
- $ I- G# i/ @8 z& @4 P* W& b! E
- t0=clock(),; V# q: d p' b, O% J8 E ^
- k=0, while{k<10000,3 N8 }# c6 W6 P Y6 @' K
- i=0, while{i<1000, a(i)=2, i++},
- ( q( d7 }7 P% P6 q
- k++5 P/ s4 z. M) j2 u% {, J( j
- },) A# O: I. W\\" B; P' \
- [clock()-t0]/1000;
- + y2 x# ?$ \9 Y
- ! J5 \, L( W8 G
- main1(::a)=8 e0 M7 S6 i, K8 B {! T
- t0=clock(), s=0,
- # c' X `& a0 d( W9 g5 Q, r0 ^3 d
- k=0, while{k<10000,
- , [. Z7 I5 z7 y. _- C7 F
- i=0, while{i<1000, s=s+a(i), i++},
- 2 W: W0 K+ Q4 m% L2 u
- k++9 b, c/ j6 W/ G: Y) P# G4 j+ D
- },
- ; \9 z% R. D\\" Q, {$ h; q9 Q. m
- s;
- $ y8 B, o6 e8 D' U# b
- [clock()-t0]/1000;
结果:
' W6 y3 D$ \& Q! m15.484 //存数据所用时间,秒
6 T& f6 S J ?7 f. l20000000.9 o/ F6 q' M. a+ R7 ^: f) s
5.531 //取数据所用时间,秒
' W3 r3 Y4 Z& `" _
' w. h! E R. f. J----------
- R1 m6 B5 e& r3 q$ @- A% o
) E) _+ l! w0 O: f用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];) j- o; j) w, q4 L& f
- mvar:; Z' n9 r3 Y8 \0 [8 o
- main0(::a)=
- ( n9 }# K+ @! U8 B! X( k
- a = linspace(1,1,1000),
- : [7 O: C: g, a0 `6 o
- t0=clock(),' t' t) {! t9 r8 ?$ u! w
- k=0, while{k<10000,+ U3 i9 q+ b# m, E2 m
- i=0, while{i<1000, A(a,i)=2, i++},
- & ~ H9 A7 X V
- k++
- ' r; S: m' N8 `4 f2 O7 r! E
- },
- # v* f1 _\\" l6 J, A; J' c( S+ a5 r
- [clock()-t0]/1000;
- : t' J+ o; y+ s5 d0 I% B# m
- % Q- v' J$ T+ B0 d4 N7 ^
- main1(::a)=
- 0 K2 ^. j$ O2 Z4 N) c
- t0=clock(), s=0,
- ( Z+ y. j* `# r
- k=0, while{k<10000,4 t& p2 K0 d! s7 [9 a( y
- i=0, while{i<1000, s=s+A(a,i), i++},
- 8 @# d* A9 n$ q6 P
- k++
- . Q0 s8 C% i P
- },' S, P) l+ `; ?. _7 g8 E+ k
- s; X; e: Y) Q. s
- [clock()-t0]/1000;
结果:) L. d, c* Q5 L
10.469 B+ e7 J0 v- `3 B) k* o3 l( M7 Z# b3 V
20000000.: b8 i! ?' k# I$ l" G! V6 |
3.781 [' {1 g+ m( X: ?2 @
/ ~4 v5 t2 r1 ~* N* G2 s# x0 a- }
-------
# U8 G, k* _* u6 G- c6 l) Z0 Z
7 v. e9 @" B1 G4 g! g在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。9 ^2 s7 o7 b v0 ^2 R) h
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
5 o0 N3 ]& E2 l" W2 i+ z4 o/ i' J; V6 O1 i3 O
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
: d# E* |* b& r6 ~/ O8 E9 B0 w4 o- n- E9 ?* _
Forcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
$ l5 Q+ y2 @* l8 L3 V+ b4 |" ]; B) S" f/ N
5、在循环中加点东西
% k" u% A) x5 {2 J- F2 M/ M1 p
. g: d- F, K s d2 }0 F4 ^matlab代码:- >> clear all0 q8 e6 j6 w6 y; A# A3 M
- f=@(x)x+1;5 a( \3 J\" E! s+ f& t' I6 X$ \
- a = linspace(2,2,1000);. T0 ^9 W. A2 y4 }# X$ Z S
- tic7 G: b8 F @+ i/ e5 c; y6 D
- s=0; l5 K7 C; q, V# ^
- for k=1:1000
h0 J$ L( c/ Q+ s2 ]6 N - for i=1:1000) i/ ?! x+ B7 u+ i
- 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));
2 I\" N3 _0 U9 ]( |( H5 s% u! | - end
- Z$ l. ^# y$ m) ~ ]8 O8 t. ~) P - end
6 h+ U/ U9 i* ~ - s; Z8 X) _$ [7 f r
- toc
* w6 Q: K+ F% P! B - ( n: s( ^. z! }1 T2 J' ~& k0 e. A
- s =
1 i! L1 J; Q& r& Z- U) o - 6 N, _- F F/ R5 n3 W
- 2.4002e+0075 {# c' q* C\" b( x2 e% Y2 t
- + P6 U' C _9 [, {5 Z( v
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];0 y! @# Y+ e+ p# l {' ?
- mvar:7 T$ Z% q! u P, ?- J6 l
- f(x)=x+1;: V7 k& x; {) ]4 z j. b: X
- main0(::a)=) X6 u- G; F\\" A9 n8 \, l2 i
- a = linspace(2,2,1000),
- 6 S0 [) g6 V% g ^/ r
- t0=clock(), s=0,! ~+ C# x' U* \2 ^% a
- k=0, while{k<1000,
- . @/ s& i# \2 [ M; y! l1 _, j
- 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 ?3 Z' d! W1 W$ ]! _7 s
- k++# S: d3 g8 e9 X |0 G& ]; c6 J
- },\\" g8 O9 O1 ?) a. E
- s;# g- m1 j; c {! M9 U
- [clock()-t0]/1000;
结果:0 X+ r& U- S/ c5 _' Y3 R8 R2 d0 @
24002271.69189384
- ~2 F5 B2 F& l% T9 O; Z! O8 H5.1722 ^$ R6 U! V6 [: g/ G, _. w
7 t; i/ _3 l8 s( i2 J/ L+ E% `二者效率现在只有一倍差距。- I' D' x+ y% A6 }& B
9 k" g' n$ g) ~) l6 J& r----------1 M# a+ _. B3 D6 T; H
4 W- q& {. J3 |# i0 W
不过,显然matlab和Forcal的程序应该这样写:
7 }9 T w3 m* [! M) t8 F; N/ ^3 p6 [+ n3 B( e
matlab程序:- clear all& v5 [* R, L$ |$ ~+ B/ z/ P6 M
- f=@(x)x+1;6 C- u6 Y8 ]. j8 s) z0 b. ]
- a = linspace(2,2,1000);% X V* O\" C* d4 y: q
- tic
9 J* j& J* _0 A% U( \# B- p& e9 | - s=0;
: X6 x+ F$ E$ V! i - for k=1:1000
q. f$ a1 ~9 x) ~( ~. K) X3 x \ - for i=1:1000\" V% A5 _0 u) d) _4 O d
- t=a(i);. K/ x$ m, Q' q5 m
- 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);8 O4 L3 X _# w: U( c0 Q0 |
- end
\" W- w* A% G. S9 L# K! s/ b - end
1 P7 F/ O: E0 P\" p\" H K4 e/ D - s8 A- W( X; m- U3 b' l! r
- toc
8 L8 i) F\" l$ j, S/ c8 v - ' }4 X\" r0 R- [5 M% A: I
- s =8 _+ |' R1 g/ P+ n3 p# `! w# p
- & r, E N8 f( H- g0 ?: h
- 2.4002e+0070 ]: s3 B7 }6 J\" |5 z$ @( @
9 _+ ~6 H8 R6 Z/ K* N. X- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];* s7 m2 @$ r3 l2 _3 Y5 M+ n: ]( O
- mvar:6 S6 X ]$ {% t\\" }3 m7 f2 J
- f(x)=x+1;' A/ `; k3 }1 l: v\\" h
- main0(::a)=- }- } \4 J! Q' b\\" @, t
- a = linspace(2,2,1000),
- : c; e& v7 h0 c7 c! |3 v
- t0=clock(), s=0,
- 8 g4 Q+ x% z- W
- k=0, while{k<1000,' F Y8 R! e( O/ s1 |, T: q' {
- 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++}, b6 y, X7 a2 |( U! d- ?
- k++
- 7 X\\" K\\" j2 [* }
- },( c0 ]! \. `9 \, V
- s;
- ) l# ~\\" u3 b2 E9 j
- [clock()-t0]/1000;
结果:
( v5 I1 ]8 C: @; ]24002271.69189384
9 X& W" w$ T( k) H% q1.625" Z0 q' z" m/ o4 L* _
( a3 I& n: @" Q9 l [ smatlab效率已不及Forcal。5 u# S* t( {" P( H P( l
7 g/ o; r# H$ q0 w/ V9 y0 G
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|