- 在线时间
- 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的数组存取效率非常高
7 `. J8 I. N1 I! m- x, `0 x2 A0 p+ P) Y" r# o. P w
Matlab代码:- >> clear all
4 \% G: f V# k' b1 U% A - a = linspace(1,1,1000);
/ C# m& x b0 E2 X - tic+ i6 |\" l3 \) ~& E( R
- for k=1:10000; `% r! q$ T7 {\" B' N
- for i=1:1000; V4 x\" h7 x4 c& O0 ~+ @
- a(i)=2;
7 P7 `\" z; n\" E - end
0 u+ {' g( V, o) h - end: }\" ~0 T* D# [
- toc
\" p$ Y1 E4 f' B - $ Q* t K7 Z( P% m$ z' ?# m
- tic- k\" q; o/ x5 w/ f1 Y
- s=0;
0 L9 w0 ~ J& T @8 Q - for k=1:10000
/ `3 g9 \! V3 H! f6 X - for i=1:1000. l. D6 i2 N# M4 u8 V; N7 v
- s=s+a(i);. b5 R5 B/ ^: x1 J: O. |9 w
- end
1 D7 n\" p3 Y8 {) k y/ U - end% F$ @/ o, }5 c
- s
! x0 l, n9 m. O$ U2 v - toc6 @4 j: ^1 a- o4 T4 E
- Elapsed time is 0.140658 seconds.
! h: t% k7 n- D0 G/ H$ B- S - & e% s1 _- I; V6 I
- s =* b5 F* F$ d/ b4 Q
\" o( L; g1 K, [ X) [2 N9 r0 L- 20000000\" m, h; d8 @% b1 N* b
: f2 x5 `* G7 k$ i O: b4 _! C/ {- Elapsed time is 0.091794 seconds.
复制代码 ============/ Z; t; F; z, l, O
& ^, H+ Y" J+ _" H3 s, d% O' E8 {- P
Forcal代码: - !using["math","sys"];
- . B$ @/ K% F# p2 T6 u\\" l; a' \
- mvar:
- ( P. F/ |0 }& q7 W/ z
- main0(::a)=
- / u# H* c' Z. U; x' J/ \
- a = linspace(1,1,1000),
- 8 l. [) f8 { r& L0 k
- t0=clock(),1 U- O$ y% h3 F
- k=0, while{k<10000,
- 0 _/ \# S\\" _ j D: D5 x
- i=0, while{i<1000, a(i)=2, i++},
- * g7 J, E3 |% i2 w, P6 h; h
- k++
- & S) [+ ?# `7 p) a# {
- },9 v- L. c) {/ A- N6 S9 G
- [clock()-t0]/1000;
- + U1 `9 A9 a8 Z
- 4 T1 x6 N3 J0 h( d
- main1(::a)=. @\\" |# S' j\\" t6 h6 q
- t0=clock(), s=0,
- 1 }- m; u\\" V6 d\\" K) S
- k=0, while{k<10000,7 G( R% S2 [8 J6 l
- i=0, while{i<1000, s=s+a(i), i++},* s5 s' E( {1 y9 @# W
- k++: R, W; f% T9 ^
- },
- % O( l1 z% c: r% Z
- s;
- 1 [* \& ]$ y1 x: _\\" x+ Q. j. g7 V
- [clock()-t0]/1000;
结果:
' A( U+ W. n+ V+ ^+ U6 j6 E5 L15.484 //存数据所用时间,秒& M, J# J R7 E" P" f
20000000.
8 Z3 v0 Y2 x4 S' [, K, R1 {5.531 //取数据所用时间,秒. {' H1 C. ` |" P' I- ]1 h9 M
- c7 S. a% |/ R1 Y; [
----------% @0 T2 }/ w( X% Z6 {
$ W+ o8 |* r3 F( y2 L
用函数sys::A()存取数组数据效率稍高些: - !using["math","sys"];. D: F8 x. x; s8 l8 w; T
- mvar:) z1 M. U8 X; T
- main0(::a)=% M# ~2 X2 s/ h- E2 I1 h' M% o
- a = linspace(1,1,1000),
- & w5 j, O9 p2 F) N\\" T; c F% l4 u
- t0=clock(),6 X4 \# v/ S$ Q% O5 Q
- k=0, while{k<10000,$ J& y; c+ X9 A, O
- i=0, while{i<1000, A(a,i)=2, i++},
- 5 o+ ?1 F4 p- K0 ^, V4 C
- k++. P: j& t, T7 Y* _1 r' A, g
- },
- 9 h3 q8 U: Q1 E% ^4 r& ]) K- Y
- [clock()-t0]/1000;1 C1 o4 R, n' \, h* B$ [\\" p( s
- ! E% S1 f7 e7 P, W% D: _
- main1(::a)=
- * m5 k2 }' `4 E0 l& k
- t0=clock(), s=0,
- , J: Q! y8 k! t5 O; w* W, m& w, ^
- k=0, while{k<10000,
- 7 M+ ]6 }* @( o W' J- ]: U/ x
- i=0, while{i<1000, s=s+A(a,i), i++},8 l& K# q9 L7 S3 R* _; p
- k++# r/ I0 P6 U3 l q
- },
- ) G* Y; E. Q! b1 }6 ]( X2 F
- s;8 M# t' q$ q# n% k( V5 I
- [clock()-t0]/1000;
结果:4 G3 v1 @0 x* F: M
10.469
! A; y7 g' S- G/ I20000000.1 g( Y' C; G7 Z9 ?' n
3.781
% ?3 r6 ?. n) x5 r1 B6 Z5 C! \8 f7 _! [1 B$ K! ]( I
-------
" O: j) P9 r/ {2 x3 q4 d- w) c: y' n1 v
在不使用函数sys::A()时,Forcal存数组数据耗时与matlab之比约110:1,取数组数据耗时与matlab之比约60:1。
! g9 |' C0 h9 P6 N在使用函数sys::A( )时,Forcal存数组数据耗时与matlab之比约75:1,取数组数据耗时与matlab之比约41:1。# ` z' G* s/ [# |
) z4 A' O o% ~: \/ E
matlab的JIT加速器对数组元素的存取效果是明显的,获得了与C/C++近乎相同的存取效率。 V% ]5 U1 T7 q
/ t, f7 a6 }) N" J8 e: _& ~6 yForcal之所以存取比较慢,原因在于动态数组由扩展库提供,数组元素的存取由函数的层层调用来实现。不过,数组元素的存取效率体现了Forcal对扩展库中任意对象的存取效率。
1 K& _$ ]& d+ B$ B( ~& J& O" T$ D/ P: j! M! T
5、在循环中加点东西8 p) T8 ]0 |' G
9 R5 G) L! j1 ?3 n. _: E
matlab代码:- >> clear all) D& C. b& Z8 t
- f=@(x)x+1;
7 Z9 w( c) m$ @) H) H - a = linspace(2,2,1000);
2 T# ~ Q1 R. h- w! S& y9 I - tic O5 r$ ]# z) a0 Y' z
- s=0;3 @& C) N9 C4 G1 g0 s6 ?
- for k=1:1000
6 j$ v) Y\" d5 \ - for i=1:1000) ~/ ]- R9 J# N5 c' H0 C
- 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));8 a' m9 g\" s% p D# z\" Z2 k
- end
+ g& `2 w# b' {0 _8 | - end
) P7 o2 [7 [ V - s
6 l, ]5 a3 W5 Z. b+ f - toc7 }) W5 z8 D! s, N0 X+ e- Q
- 9 w# Y, c# X\" H& P2 W
- s =
% p\" \: v. M1 o/ B5 B ~! u6 g, [4 N - 9 P0 G/ b5 E1 |1 ?: R
- 2.4002e+007$ _7 p. p3 N, Q/ c! a* y
- ) [* K% F+ K+ D( P2 [$ u
- Elapsed time is 2.252997 seconds.
复制代码 Forcal代码: - !using["math","sys"];, z, @1 p4 ]; b
- mvar:( m, b' V* [7 M0 D3 E\\" ^6 ~6 n
- f(x)=x+1;
- / Q9 m: [$ e: n6 e
- main0(::a)=
- 0 T9 j& t. R o. ?: I4 _% B
- a = linspace(2,2,1000),
- ' d0 D\\" b7 i- ^' A9 _: X/ ]) N
- t0=clock(), s=0,
- 2 n4 \, ^6 U: D0 \7 E0 i
- k=0, while{k<1000,
- 1 c4 x! m' P0 o) K
- 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++},
- 5 A0 y1 v- f7 S, t0 t\\" d
- k++ @$ u4 V$ |2 ?$ m9 h
- },5 H3 `& I: v$ |3 E
- s;
- 9 s4 N% \7 z# ^+ _+ w& K U& O
- [clock()-t0]/1000;
结果:. N9 p9 h" t% ~7 X$ J' f* ?
24002271.69189384
% h% ~0 h( w8 U+ X0 W3 o0 I+ v5.172
: X. U- C% ^% }, u8 p- C" \4 V
# J% P6 S# T& C" o; `7 q2 B2 ~: t! O二者效率现在只有一倍差距。
8 N0 _& \4 v1 m4 V& @1 I7 f1 {
* J, w3 ?/ q& D) t% I----------8 ]7 R5 m( A: G+ C. Y
; j6 M4 T/ l9 Y; _* K不过,显然matlab和Forcal的程序应该这样写:
, w! T' P. o% \3 R8 O- v9 c- n9 I1 K4 v! A. B' ]' G' J' A
matlab程序:- clear all4 X\" Z7 R7 q9 X0 q% E5 P
- f=@(x)x+1;! {' t3 ?\" v1 P0 }7 p( y% N& s
- a = linspace(2,2,1000);
3 z+ n: \2 d5 u- S( Y# A - tic: B& j5 x+ k4 w/ B- L
- s=0;
; U# @; D/ h4 i, S* e - for k=1:1000
5 t& y. U0 i; ?8 j2 m - for i=1:1000
+ U$ A! S5 b: a' s8 p) F - t=a(i);4 |+ R- o* G2 z
- 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);; |9 J8 K# O Y& Z' X6 m! u
- end2 G- ~* P+ _+ n7 @- X- z) m
- end
0 N8 k5 P# F+ V& q* p W - s
, F) B2 Z% w4 n* Z - toc ~1 F4 O' W\" n& }0 _0 U: L
- 2 O R4 D' W6 u9 N# E
- s =
4 ^' [' \8 i* m' ~, r - 6 j% ^+ D6 r4 d- Z' U: l
- 2.4002e+007\" [5 x8 ]* o9 b
4 J* o8 w9 X, s9 u4 g. D- Elapsed time is 2.043909 seconds.
复制代码 Forcal程序: - !using["math","sys"];1 K7 u1 Q- m* d# U, l4 z8 z
- mvar:/ r\\" C) d8 O& I9 C! M+ C6 V6 {3 ?6 t
- f(x)=x+1;
- ! m& M G4 z: w0 Q1 D& U
- main0(::a)=
- ; i; B& M' p, X) n\\" w% @8 {
- a = linspace(2,2,1000),3 r1 w; V4 h/ g; J
- t0=clock(), s=0,
- % {2 V7 V, U+ y
- k=0, while{k<1000,2 Q/ c\\" q# R* M* j
- 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++},2 Y ?2 `$ t; M4 T6 R9 W9 y
- k++
- % U6 X. l. ^1 x2 X) ]
- }, ]- `/ l3 j+ a- ^. ~* Q% i
- s;; I) I$ y& B, E
- [clock()-t0]/1000;
结果:2 V" Z) q0 f# _ x0 n! X# C+ F( F
24002271.69189384
5 |- U7 E. @0 V8 L' j1.625. ]) a5 K/ s5 [8 L
: O: G& O! Q; o1 n0 |matlab效率已不及Forcal。
4 L `; d, p6 }3 R& A* i( b# t# x w
9 y3 b. n, S+ }# N: L提示:目前Forcal对数组元素存取效率较低,要想提高效率:(1)用临时变量暂存数组元素;(2)用专用函数sys::GA( )和sys::SA( )一次存取大量连续元素;(3)对数组整体操作。 |
|