- 在线时间
- 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 u7 _2 ?# k; t' V* }
, H; Q4 _ j: i; R# m. Q
Matlab代码:- >> clear all
4 K# U7 i\" S: K - a = linspace(1,1,1000);8 Q% f5 T* T& K7 }
- tic; i% E# r# h) W/ S2 o
- for k=1:10000
6 w, m; w9 N8 K/ P% Q( a\" p - for i=1:1000) |3 s2 O- j9 y% |4 A\" Y/ ]
- a(i)=2;
3 v; Y. q0 p4 @6 Q: a3 ? - end
( I1 a. T3 ]6 e z - end
# b1 z, V\" O/ z: }5 Z7 O - toc B# [4 z) g; m4 j' W( Y
1 e* F8 O9 z7 h! U- tic7 E, J' \* M2 c; y7 v$ V, [6 k5 B
- s=0;2 O7 m8 W: i+ V1 \. h
- for k=1:10000
% F8 v* J7 a9 ~ - for i=1:1000, r0 m$ t/ O% O, L* @8 {+ v
- s=s+a(i);& j- q. a! b# s% r
- end
& b* Q. U* |5 E% q1 X( P5 P - end& R$ \$ D# l; f2 u\" W1 O
- s; m* v; c$ I5 r* {6 @5 B; J5 [
- toc5 R% X/ a# x3 z0 v
- Elapsed time is 0.140658 seconds.
U) _/ M' P\" H- t - - y8 Q. V, T7 f9 n- o+ }8 K
- s =
6 n; O, K y4 e( h. Y5 x - ) y5 f C& h, H. w/ H
- 20000000
: f- N% @$ A\" ?* x4 Q: t$ J
2 J. n) b2 [% L! d2 y0 D- Elapsed time is 0.091794 seconds.
复制代码 ============
3 s) _7 _- \- E( ^1 ?0 w& X; E, q+ i" l% b( i- w' E
Forcal代码: - !using["math","sys"];
- 9 k5 H5 \$ } [' g
- mvar:, O4 i4 g+ G+ M5 G L
- main0(::a)=& v' E# z V0 A- l/ B. ?$ q. T# M
- a = linspace(1,1,1000),! w; T; E6 a' X% E w2 t' L
- t0=clock(),7 T9 g2 x/ [1 K4 P* E# d* e
- k=0, while{k<10000,% m# G$ ?: [8 L& V7 Z
- i=0, while{i<1000, a(i)=2, i++},3 O$ l) \4 d0 _4 B
- k++0 t8 q9 u: ^/ z
- },. d$ o, X; @! ]9 ]/ J! t
- [clock()-t0]/1000;$ n8 h8 l9 o1 `% P6 `7 b
- - R9 l$ s& O+ U
- main1(::a)=8 A4 \$ y3 b9 P: Y: }\\" [) x& ?5 n
- t0=clock(), s=0,* ?7 O# [5 V# { w4 X' T
- k=0, while{k<10000,
- 8 J8 {7 c- Y! g2 b% l
- i=0, while{i<1000, s=s+a(i), i++},
- # N# [% f- h) U\\" c8 X
- k++9 c! H8 g. V0 [. L# u' }# w
- },# u) v) E8 [0 \1 @, ]
- s;) M2 U! R4 C& O# N7 t
- [clock()-t0]/1000;
结果:9 x$ y2 M5 T, O6 N) Z; N, ]
15.484 //存数据所用时间,秒
' _* B" q( A9 J* x: t9 U7 ]. }20000000.: a8 N; n9 @! e0 Z u& e& b9 E
5.531 //取数据所用时间,秒3 |2 t$ Y1 Z9 l$ m5 L: c6 ~
. O2 ] C j& R, N
----------2 r) g6 f9 r$ M3 v4 N' v
u. k Y2 T& e
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];6 F+ x, ]3 }7 |7 W; X+ o, y7 ^
- mvar:
- + q3 i W8 W! Z$ d
- main0(::a)=
- ; ?- R. M ?. |/ J# B5 A- M G7 W
- a = linspace(1,1,1000),
- ) ?5 M& C& }. t/ q
- t0=clock(),) U' S; p+ u3 ]' r
- k=0, while{k<10000,$ T\\" x4 ^1 W& I8 [! r+ ]
- i=0, while{i<1000, A(a,i)=2, i++},1 H1 t: a- @0 y( h1 |
- k++2 v* p; ~- `8 u/ ^$ f K J
- },
- ; q3 G' @9 ]7 r: i\\" N: y
- [clock()-t0]/1000;
- 7 V) q0 i3 P5 H7 J, D; c
- 5 d2 J b5 ?$ C) y9 [- x
- main1(::a)=
- ' b9 B1 }% t- `( ]4 v
- t0=clock(), s=0,; }/ h9 \2 f5 W+ Z5 S
- k=0, while{k<10000,3 _: ?3 M K& X% l4 j0 r1 w
- i=0, while{i<1000, s=s+A(a,i), i++},3 Z\\" `$ ?# Q N% N. d& {! J
- k++2 }8 [7 g: t! l) b6 o
- },2 Y+ C8 x {- e4 |( e, y: g- C
- s;
- 0 ~( s; [& h0 y# m
- [clock()-t0]/1000;
结果:
6 i# u' Z! f( g' t. Q; h. \( k10.4695 R% z, K3 ?* \, i% Q5 i
20000000.
! k. _. Z& r# Z3.781
' f( y- g) k1 t9 E+ q& I7 E5 E" c* C; D" f/ Z
-------+ B3 y+ w" G! n6 k# P' G- \& X
4 P( V* K) j* t/ ]' W* m2 D
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
- X" x" r5 {( V0 {在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。# E* `4 R, c3 G
- b8 m4 a( d) Q0 c, i# {matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。# p7 d7 v+ q; p
@* R X) ]4 |# z6 a" b9 Q5 w" GForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。0 V. q5 ?! w3 n9 S0 n. n
/ V! \: M F( u& g* B/ ~5、在循环中加点东西2 s3 h9 B9 Q$ m" ]" Y
& k4 e; W+ Z7 y* dmatlab代码:- >> clear all
: \5 \) G# z$ H7 u - f=@(x)x+1;: N\" f* W4 [+ Y7 m
- a = linspace(2,2,1000);7 z8 ^: F: j8 J\" t% l( c5 V; S
- tic
# q7 A' R4 f9 ] P# v - s=0;
# ]$ f5 I3 H, }& T D; e6 ]% [( c( | - for k=1:1000
/ F7 K5 b: D Q' |1 z - for i=1:1000/ q' e q ?: B: J- R: |2 }\" h u0 N
- 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 G# {* I/ W) f( O6 S R
- end& a7 _$ I7 K\" G& t4 W* l\" N
- end
/ `3 g, e! e8 |4 U' \0 }0 ~ - s) v9 u/ s; b0 r: I7 X; J2 R6 y% k
- toc
% G0 [: m9 [' r! ~$ o* C7 y
/ x( m4 Q\" K1 R- s =( W9 i, B1 I8 ]. B2 Q- r
- % w9 N: m( V1 T1 j4 X, d
- 2.4002e+007
, t, @\" a; _* a( u - 4 {. v\" }+ k/ {. d
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];$ l4 d9 |: b! i' w5 I! i+ B
- mvar:: y4 x! Y& W, q9 f1 C! C
- f(x)=x+1;
- 5 O2 W! W; Z) l( n H' p* y( l
- main0(::a)=0 I/ N\\" P1 |' j4 f* x
- a = linspace(2,2,1000),' B, k K. T8 H5 P$ Y
- t0=clock(), s=0,
- - b/ M/ _0 \; n$ j
- k=0, while{k<1000,
- / [% C: r( H0 e- r6 O. Y
- 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++},
- ; T& J4 m( d F7 @# z
- k++1 @7 R0 J- f\\" [8 v* j7 G
- },0 U# R- X% W+ F9 X+ R\\" R& b+ J
- s;
- E% X5 d3 G! y8 o\\" o; G7 i& K+ z
- [clock()-t0]/1000;
结果:. {2 }) D; O/ U1 M4 e: {% h. W4 U
24002271.691893843 ` ?! R7 }7 `# ?
5.1722 x0 b& W; X/ K9 F9 J8 K* v, C
+ L' h0 \0 A: o3 f
二者效率现在只有一倍差距。5 F* E9 }% ~4 a6 y9 i
# v! |2 x2 k0 y4 C----------8 o( |7 c; f% G. `5 T! V7 a
3 d. t: n+ K d; L7 [. n
不过,显然matlab和Forcal的程序应该这样写:
! a. o' {- ^$ F7 e6 r Y* ^5 n( G. u# l! S
matlab程序:- clear all
5 ^, G! N0 _7 H' z3 J' C; S - f=@(x)x+1;\" F0 M$ U. Y& ~% f
- a = linspace(2,2,1000);
8 T, O! B8 u\" f; C& T# Z - tic; X+ \% N' G2 O# `\" r
- s=0;
) S- q; z2 J! I/ D6 d& Y7 [ - for k=1:1000( W3 {+ O7 h. W _7 d y
- for i=1:1000+ B( c# F B6 _8 P
- t=a(i);
, n8 a, k2 R\" G' [ - 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);
+ p5 z/ a( |) B2 ^5 d* S8 ]. o! X - end
# K) D6 C3 y2 O3 U- ^% z( b - end' F( H' L& R+ ^% j\" f, \( h0 N
- s
* B0 {# S6 R: ?: o5 _! X - toc
; b v' U, Z& e; S: _
i/ C0 ~7 \9 U6 U5 a( q- s =5 s; }( B; B! k( h9 x# b
$ s- V) U; s7 T' s; f3 d# P1 N- 2.4002e+007$ d5 v1 l, u( z; j( ^ Z* E0 {! c
% q* [& W/ c5 I: l* ]- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];& J2 G) e1 Z9 J8 A% D# D0 G5 f# }\\" ~. n6 y
- mvar:6 H/ l: q9 E# k( a& ^
- f(x)=x+1;7 `1 u+ |; T& O# C C- p% {
- main0(::a)=, m# b% o1 J% k8 q+ ?
- a = linspace(2,2,1000),\\" c/ g. q! a8 T# I& G
- t0=clock(), s=0,
- 9 i1 J- ~+ R\\" _
- k=0, while{k<1000,) i- t5 i$ E' o- ^, 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++},
- 7 z9 @$ O! J* z1 s7 r( J, i
- k++. r# X$ S9 g5 X1 h! s- X
- },0 W, O4 @. @3 e: X
- s;& g% g; e# p7 k- t5 C3 T# b# D- K
- [clock()-t0]/1000;
结果:
. w' T: I% J$ W! H9 A24002271.69189384
# J0 {/ ~. L6 N; V1.625
+ _6 {5 Q/ }. R0 Q+ x/ i$ }5 B1 g4 E9 N ?
matlab效率已不及Forcal。; S6 u0 b0 }; R: d! \2 h) C( I
# C! b6 M3 g; _& w提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|