- 在线时间
- 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的数组存取效率非常高
8 ^+ D% b% T0 Y0 L$ W; R* q+ k8 a3 x* {8 T/ U: E# w. ~6 M! e' l
Matlab代码:- >> clear all. ]( w! X4 k: A. ]' @% b
- a = linspace(1,1,1000);6 _$ n K) C. M/ t. @
- tic7 F/ R) F' c0 L' s( b4 e1 ~
- for k=1:10000
6 g \7 m; d3 p. | - for i=1:1000
& ~. H% F. v) l: l: k2 M - a(i)=2;
# W# s8 E: h' `! ^' _# X1 Y7 y - end- M9 H0 R' L$ C4 j g, s; V
- end' W. J+ c9 J; N
- toc
& p7 y# I* u q- x* ]0 n
, w& ?8 f$ e% l/ E% F$ z- tic
; V# i w8 \6 r\" L: l- v3 m l8 [. a - s=0;+ l6 Q7 r. y1 [% l1 X/ T# K
- for k=1:10000
, L\" ?2 B! i* i! F5 j* T - for i=1:1000. R5 @( ^' ~! f1 }0 }
- s=s+a(i);! L3 m3 G' b- X) ~9 T
- end, U4 m7 I7 L5 ?, i1 ]) o. v
- end
/ g- O* o6 i5 C6 s7 Z6 ]; ?- v\" Q - s
\" I* Q. {% S+ F4 I3 e: E6 ^6 y - toc
3 g! T4 W! `1 v: Z: { - Elapsed time is 0.140658 seconds.9 O/ V\" a; v% A& @4 \; g# q\" b
: W8 d( _) h, y- l8 _! `- s =
R5 L0 H. g E3 a7 b6 U - $ ~$ r! Y6 l6 C
- 20000000
9 A2 p/ ~' ^\" U
3 Q3 o' M/ y- Y4 ^! G6 F( I4 Z, \- Elapsed time is 0.091794 seconds.
复制代码 ============0 ^3 G0 `0 q( J9 B& I% z2 f
, {4 n% J3 Q4 H! \% WForcal代码: - !using["math","sys"];' [% `; G w! A& ~
- mvar:
- $ w3 x# \9 J+ ]3 G' n& \* {5 p' |
- main0(::a)=
- % ?3 T+ n8 x+ F\\" {6 l
- a = linspace(1,1,1000),8 {0 ]5 B: U6 u% m
- t0=clock(),
- - n2 o$ w, ?4 q* I0 [
- k=0, while{k<10000,
- 2 h+ T- m* t* g- i2 |1 A1 r9 _
- i=0, while{i<1000, a(i)=2, i++},
- + p5 x8 j: m+ y\\" h2 l+ p
- k++
- & G; A5 _! e3 I3 F
- },
- / c% L7 \8 c* \# P* v+ a3 L! ~) `
- [clock()-t0]/1000;% n( t1 F& l- u
- 3 q9 c& {/ B# g% X3 b
- main1(::a)=
- , s- N' ^\\" w3 c
- t0=clock(), s=0,
- % g/ g* r; I' u7 J
- k=0, while{k<10000,
- * t2 v4 x* K( D) o. g
- i=0, while{i<1000, s=s+a(i), i++},
- 7 w2 b0 l5 L+ e* c$ b( b
- k++% L3 T. B/ j: s( Z |+ a7 D; h% j1 h
- },
- 1 _; J\\" q2 h4 k\\" a8 s. d A* E
- s;9 s2 {- w/ s- l# G8 @% {
- [clock()-t0]/1000;
结果:0 d( O' Z6 F' v# c/ Q2 M7 |4 @
15.484 //存数据所用时间,秒/ @% y5 ?; `8 f: q3 O/ e
20000000.% w" w ]7 K2 H5 P$ K R
5.531 //取数据所用时间,秒* u1 |6 s; i( f# |3 z+ ]' o
+ }: {% E( m7 }, [3 ?+ y! h4 E2 x
----------
! v- x- K, Z* ?% z+ B S* G/ H4 Z, Z. u# ]6 @7 R
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];
- _- c o G% d
- mvar:8 K0 D* v1 p: }4 _/ C
- main0(::a)=
- 6 ?( x) I3 j$ Y
- a = linspace(1,1,1000),
- - z* H! j$ J2 F/ t8 D: H
- t0=clock(),0 p3 p$ V% L9 R4 I! h+ p
- k=0, while{k<10000,
- , A- T, m* o- A9 a4 d
- i=0, while{i<1000, A(a,i)=2, i++},
- 6 }/ {9 H* a1 h( _3 E$ L% R
- k++( L. M, r& ?/ }! i( I
- },2 p( h\\" A u! j. M4 G+ h
- [clock()-t0]/1000;$ J/ x% s\\" X3 I
- 2 W6 V. S; k- I3 S7 \
- main1(::a)=
- 9 l( F, n. m- p
- t0=clock(), s=0,. |) H; v: B% ~( [
- k=0, while{k<10000,
- 6 {. H+ k C8 Q( A2 h1 I& Q; u5 r' x5 S
- i=0, while{i<1000, s=s+A(a,i), i++},1 Q- S$ w% O8 ~, E7 `
- k++
- 0 k' g( ^ g6 {1 }1 k) j, U& s
- },
- ( o\\" D8 B# k. `% M
- s;% R. ^& g0 g: {: l0 B* W9 t
- [clock()-t0]/1000;
结果:' E6 g- d5 \+ m6 }' S
10.469
! b% W, \* K- @: q5 C/ \" q20000000.
, K4 T Z) p: ^8 x7 ^: _; C3.781
; ^! |; C$ V) m
+ V$ f+ q" C$ x0 m-------+ z% F- ^. I) U" o
0 \, J1 t ]! t! G @% Z在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。5 m9 _. ]# ~$ n% u: R! W
在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。
1 S% N$ w* Q% G! c6 m# q5 r/ N$ a, M2 X
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
, g5 |1 [& y, o+ j# x; j
" g4 k) }, _ H+ tForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
4 y* ^0 I h+ Z3 ]1 s! B4 w6 z8 i9 ~: @6 L' j
5、在循环中加点东西, u4 ?3 L- ` P! F4 u: B
5 K$ q8 g h# o# d! {* _/ C
matlab代码:- >> clear all2 C% u4 i0 v9 M
- f=@(x)x+1;8 O; p\" Q2 A8 ~8 W& v/ g1 J; p1 P
- a = linspace(2,2,1000);
% F/ R2 M\" p' o - tic/ a1 E6 A: r7 Z2 Z( `4 R+ m
- s=0;
( U6 q\" j/ @8 b - for k=1:1000
. S8 f' L* [\" I( v# ~/ @1 @0 B) V - for i=1:1000
7 H0 _2 N9 [( J7 [. `\" s6 I5 t - 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));
% @, Q\" N! ^2 Q\" W- G& r* H. b - end; x2 z: W; h\" u! u7 H r0 F1 _\" ]* q
- end& k- ]* Q: S2 F) |) X' E
- s+ a4 d s. x. H
- toc5 c2 k; \% i9 e* { q, b5 @$ S
# u( C5 D' X( k- F. A- s =& m. C% {: e+ ^7 ^. c8 |* m
+ n' w9 ?9 q) [' t\" o# o- R% ]- 2.4002e+007
7 T4 R4 K) D9 R9 L8 c, D4 O6 P& Q - 2 H/ K9 R2 K4 a9 R9 U* Z
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];# _/ I) I7 ^9 h8 o! j
- mvar:4 P3 [! M- k3 i8 N% `
- f(x)=x+1;7 e: Q; f# B$ x, S& \
- main0(::a)=) l _% C/ I) s# w+ P- a
- a = linspace(2,2,1000),' Z9 t% ^1 B5 E1 }5 h1 B; o\\" i
- t0=clock(), s=0,
- $ J/ [3 \$ `* z9 P( o8 s
- k=0, while{k<1000,
- \\" e5 ?) n0 D; k% l V1 b
- 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++},
- + \) Z\\" \5 z8 x. {4 T7 Z1 D
- k++# U0 @' {1 p3 i. {$ F* U7 r
- },\\" H! T# D; n m
- s;
- + Q! h; P- H# ?8 w+ _; i5 P( L( ]6 N
- [clock()-t0]/1000;
结果:' l# s7 E6 ^4 L
24002271.69189384
$ }8 f' T6 Q1 r5.172
; c. Q$ H4 \+ [4 f
9 T5 W. I# A( g, R) p二者效率现在只有一倍差距。
, v" d, R- [& Q! h/ x
; h4 { V( q4 x5 j& X- Y# Q----------
6 r! L9 ~) ]4 `5 q2 ?$ i4 ?
/ r$ c/ D: w8 i8 K' Z/ a# B m ?: X不过,显然matlab和Forcal的程序应该这样写:2 u3 W: l9 q6 _( [+ [- c
/ N3 }) p& ?" t
matlab程序:- clear all
8 E) y0 r+ ^% u* z* Q: `$ O% k - f=@(x)x+1;6 L& F# O% i6 L2 e
- a = linspace(2,2,1000);4 F* ~- P w0 K) i
- tic
- a# |% Y7 A6 m1 j) h\" j - s=0;
* ~9 h\" u' x3 K8 \/ r! x - for k=1:1000
9 `8 r3 [8 P3 n0 U& F - for i=1:1000
5 O\" _* Y' F) c0 m$ ?+ ]3 t0 Z - t=a(i);- @ p6 B/ W3 Z, f; } n
- 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 s+ H( i - end
+ S# D0 K; W\" k7 n- l6 { - end
\" J2 E8 w9 a) s; Z) C+ o - s( u! L' N. o. \$ b1 |
- toc
+ x; D7 `, B; e C% E, x- s
5 F, K\" S% W* _9 c( R& o- s =\" R% e+ g* l1 I6 \
- 0 r4 d3 ~( ]2 {% c5 t7 j2 I9 L
- 2.4002e+0079 R3 D x/ j0 f0 k, |. V
1 Y f1 s/ l1 x- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];
- r3 X, r: C2 f& B V
- mvar:
- # }! d( q' X. M
- f(x)=x+1;
- $ ~- U' C2 b! O, @/ [
- main0(::a)=
- , n! }$ d% R2 ] m# x
- a = linspace(2,2,1000), D9 t7 o- x8 u! B\\" w4 X3 Q
- t0=clock(), s=0,. h0 Y: F: U; H
- k=0, while{k<1000,- k* q\\" t0 M. O) B# 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++},. H3 }* J( e I( E
- k++
- * U& w, {& H1 t2 Z* Y
- },; F& \, {: v3 t4 D' @
- s;6 M* I5 n' L% @\\" o8 m9 p8 a
- [clock()-t0]/1000;
结果:
3 P$ o! b0 T$ Z* F- Q. ]24002271.69189384
2 R- R/ b- T9 S8 H a8 {; S& L1.625
3 J/ Q3 U6 Q4 X) T# A: ~
& Z' } ?" d; x T/ Ematlab效率已不及Forcal。7 \! U/ g0 v$ m) \
; x H9 Y" l5 z
提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|