- 在线时间
- 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的数组存取效率非常高
% P1 }# B! J) g# W" `1 ]% k" r( x% o4 s
Matlab代码:- >> clear all7 i8 W2 Y+ Z' W' B3 ~
- a = linspace(1,1,1000);5 V1 r0 c* l4 |7 ~\" H) t
- tic
( i7 r+ `& n( A0 _6 S - for k=1:10000. U\" n1 A3 P% g9 S/ c. h, F, A3 s: r
- for i=1:10009 ^. p m\" v/ F
- a(i)=2;
# y: L8 V% B f4 n& N6 H! o - end
* p$ {. J* P2 i$ {: G3 z- S - end5 G, y1 p1 ?: \2 q i3 \8 F8 Y
- toc
# e$ H2 o9 _9 p8 C) k
; `6 a8 P6 b, x9 ~# y- tic# o- ]9 x9 `2 a* j9 E
- s=0;
1 I& j' z7 s* G; E; |$ X - for k=1:10000
* d- |/ H1 k0 i) F* |' { [$ U) } - for i=1:1000
. p7 B1 s9 y# C z* q- p - s=s+a(i);% y5 e( Q\" v9 a+ b0 W
- end. B8 k1 K' T, x2 n; ]' [
- end
* v D0 [' ?5 Z4 W6 H- m) v - s: ^2 G* h7 j0 \
- toc6 ~( O0 P2 b6 Z, C# A/ H. Y y
- Elapsed time is 0.140658 seconds.
5 m\" j& ]: ~# d4 k
; B4 o n& ^+ \- s =
1 m% ]0 \0 a! F0 D# _
, e$ B: ?8 t+ C5 `3 c- 20000000* a+ G9 I( d2 {. c/ m
- 8 y/ q; N4 H2 R' v @7 Z
- Elapsed time is 0.091794 seconds.
复制代码 ============
$ ?. N# e h% k2 F, y! a; }" ` g
9 l+ I- p. Z7 c- l# L2 H8 dForcal代码: - !using["math","sys"];
- \\" C$ P0 @1 I. `' C' R
- mvar:7 b+ k7 d0 i$ o0 D\\" t* `
- main0(::a)=2 M4 T( S5 j, O$ T4 y
- a = linspace(1,1,1000),
- # k- d9 A7 u\\" I. Y* _. J! R; j6 U
- t0=clock(),6 ?# P; w/ W6 q+ h: z
- k=0, while{k<10000,$ I- e* N. _6 B; y; T$ Z
- i=0, while{i<1000, a(i)=2, i++},
- % ^0 I1 X: \7 p8 |. J3 z
- k++
- 7 l- S9 r4 m9 w, q# A9 w
- },, V2 T' G2 t: \4 Z* a Q! o+ T% @/ F
- [clock()-t0]/1000;
- \\" G8 Q( N\\" {8 ]2 L$ R
- % x7 b' {$ h! u5 l7 b
- main1(::a)=* F% q! j8 e8 ] t& X( r
- t0=clock(), s=0,, S5 H& `/ j! S: `+ u9 F' \
- k=0, while{k<10000,
- 2 n5 E( ]* d4 B% e
- i=0, while{i<1000, s=s+a(i), i++},: X; p+ {* Y# n2 O: x1 }
- k++8 Y6 i7 d( h8 b+ o
- },
- , s+ n$ h, x. _! f1 d4 K
- s;4 f9 s* K9 O& q& @# n! Z/ I% y6 F
- [clock()-t0]/1000;
结果:
+ A* ~# N2 w# u! m7 A# s15.484 //存数据所用时间,秒
" A; t! P- j" M/ C- N7 U: G20000000.. M4 f( E" A4 g. j, |, b
5.531 //取数据所用时间,秒- x8 ?$ u- Y: M; a+ I# r
7 E5 p8 ^7 S" E. N2 {----------
1 r/ S: c. k- B1 Q, p
: `* \5 U, j! |9 q8 y5 s* O用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];! G( C6 E2 x* x% z8 Y i
- mvar:
- 5 k: b% I\\" u* @2 D/ H$ H
- main0(::a)=
- 4 T/ ^# O1 F, F8 u3 T/ \+ v9 q
- a = linspace(1,1,1000),4 x6 [8 Z$ x$ l4 k$ I
- t0=clock(),9 d+ I\\" f& V) R- G7 B
- k=0, while{k<10000,
- 2 S! J& ~4 T1 W' @/ u
- i=0, while{i<1000, A(a,i)=2, i++},4 |# j; o/ U S, L% v
- k++
- ! i* V8 M- k) G/ D
- },
- ) P: r0 f8 ^, T1 R
- [clock()-t0]/1000;
- 9 \* t% i: l! \! w' ]. V1 u6 w. b: i1 s. P
- 6 g% Q; q\\" a4 K6 ]6 n4 n! i\\" }% v5 s
- main1(::a)=: N7 r& x: Y9 b( T7 w h
- t0=clock(), s=0,
- ' }1 Y4 y. v; }9 g$ e' V
- k=0, while{k<10000,/ R) ^# `. f! c/ ]- ?
- i=0, while{i<1000, s=s+A(a,i), i++},+ t0 U! r3 s& w4 D4 [
- k++- H' O1 M7 r9 j5 ^
- },( d3 a! [# `; Z3 Q9 m
- s;
- # H* a# f' ^ s( Y: d4 q9 X
- [clock()-t0]/1000;
结果:# X! \# f* w1 J4 d+ a8 Y4 g
10.469' _, s2 d1 ~& [! l4 \
20000000.
t3 P, |" {6 |9 _ Q( ~ q$ n3.781
6 f0 ~5 Q: |1 w9 L1 @' r* ?( W6 }$ ~$ G
-------
5 ^- B. j3 q1 M% H0 ~& z7 N) d2 T$ N- C6 e; z
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
; f) J% |/ E+ a, K& D4 u2 [在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。$ ]( e. t; g& }( f% h& P5 B4 T) \
! R |/ ~, ?$ s* |$ D; ?matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。
. a2 b/ F: o$ k6 ?
W( d: I* O! o: X6 lForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
3 c6 ^# i1 n4 U2 T9 o1 {
0 K9 f+ u8 x! g# l% V Q5、在循环中加点东西9 H: I/ ]2 z: X
% ]9 q& q3 n" P& k4 A$ O( Q
matlab代码:- >> clear all
7 ]% u# X z l. v' _! y/ t - f=@(x)x+1;0 C3 \7 i\" \6 q; |+ G2 G) w2 f0 v R$ r
- a = linspace(2,2,1000);
& k1 a\" c6 O; Z' @1 `/ ? - tic
# K5 g5 k3 V* r2 R' A8 n' R; W - s=0;
1 G1 g% P/ ~5 |* Z/ x6 r - for k=1:10001 e& _3 B; H\" i! e6 P
- for i=1:1000
6 B3 m! i/ `' t0 q6 r8 [ - 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 q+ o( |; }# U\" E - end
, k6 _+ M* ?; `4 p# m3 J - end5 u5 t; ^, I s6 f) H7 p8 Z
- s8 {. c7 x. l1 } I/ T9 m
- toc
/ Z# }2 I! [- w. E% T
9 v+ @$ A9 T% f7 F7 Z' G- s =
( K: C0 M/ a) \) d
0 x- f/ Q9 L\" n- 2.4002e+007
\" N; N4 H+ w3 f& Q
8 J8 t5 E }# K2 w- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];
- + O1 g* |5 s- i+ t
- mvar:7 D; Z' h) d5 |5 x
- f(x)=x+1;
- , p. Y% {$ u; G7 m: I( W6 M+ k
- main0(::a)=
- * \1 E4 R' q4 l& ~
- a = linspace(2,2,1000),
- 7 s, W$ H% i. ~0 K* O: r% n# ^
- t0=clock(), s=0,
- ' R$ v% h7 P& a7 b2 O T% u6 p
- k=0, while{k<1000,# s3 c. v% g3 ~* l7 v! n
- 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++},
- 6 w; |\\" @1 y- ^0 x2 z
- k++
- 0 m% V$ H* D# D. L/ {8 j
- },: e6 o& s) s& y/ I7 b7 t; N5 ~; H# k
- s;
- 6 t! k1 i3 ?6 e
- [clock()-t0]/1000;
结果:; k" @3 V" R) r, ~; E4 l
24002271.691893849 F0 g9 e7 j# P+ n( h
5.172
. p" t2 a$ ~) A/ s$ q" S& g! W1 d; `4 ]3 u4 B
二者效率现在只有一倍差距。
: g: T& B. ^4 x* x1 T
1 r% Z" u: }% e5 L8 ?7 a2 v5 R----------* x# k0 L4 [ l( x
" p: X) W7 a' w
不过,显然matlab和Forcal的程序应该这样写:
% ~) A) c! K6 `& x7 K2 x& Q$ t$ D3 z' H
matlab程序:- clear all$ S, u3 c3 k; U) [
- f=@(x)x+1;9 O8 k2 Z) S* k- p* _
- a = linspace(2,2,1000);# k5 `* ]. \8 o, C# Y- K+ B$ N
- tic
( l6 v2 A5 T5 X# v J5 D5 t X - s=0;
+ i, p3 v' x\" Q - for k=1:1000
8 J4 v+ I+ Q( B - for i=1:1000
& K- N* Y2 ]: T `/ y' i0 P! A - t=a(i);) a. h+ L' Q5 [% Z0 P; l! y# s1 F
- 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);
( a% q: U n, T1 O/ d( D - end
8 ]\" `, a8 q5 p- I' Y z - end I( H( ]- a! Z- X2 z0 Z$ C& j t' M
- s8 ~2 P( E5 Z7 ]4 W1 B0 c4 \5 u
- toc
6 _# _# c1 w/ ^: H( T$ W' n: } - ' u$ H) [) s3 D% C
- s =: `9 F8 J9 k$ ?\" U
7 X5 k0 @0 e; a/ \1 M- 2.4002e+0078 {& e3 I8 g+ O) s) E
7 a, V, J- c( ~0 X; D8 ]- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];, P% n* p5 B P* _/ f$ f* M
- mvar:
- : z8 [7 t# A7 S7 Z3 Q# M
- f(x)=x+1;
- 0 X5 _ ]1 M1 Y3 n
- main0(::a)=* k% G9 C) F- t1 G7 Q
- a = linspace(2,2,1000),
- 4 |5 ^& c' [+ m# e/ l Q
- t0=clock(), s=0,
- ( S. Z! [. j! a\\" q
- k=0, while{k<1000,
- \\" C) e- x' i1 v# Y
- 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++},. K6 c! q6 ?$ k: \
- k++ d( u4 D/ ?; D1 F
- },
- 9 s' h( ]1 v( W* a, O
- s;
- ) y% N1 k- x( ? o5 G$ W4 a
- [clock()-t0]/1000;
结果:! t" W! }) ^$ S
24002271.69189384& i; }% u( C5 i
1.625. u. O1 n5 f! d7 K' U
8 D& a5 E* B `/ W! y* G, b- Jmatlab效率已不及Forcal。
$ t* W$ R' c! e7 G- P
: w F$ E2 ?1 u提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|