数学建模社区-数学中国

标题: 极限测试之Matlab与Forcal普通函数调用效率 [打印本页]

作者: forcal    时间: 2011-7-31 10:18
标题: 极限测试之Matlab与Forcal普通函数调用效率
数值计算,例如微积分、微分方程求解等存在大量的函数调用,故高效的函数调用对数值计算软件来讲是至关重要的。5 j/ T# H7 F0 D- S6 c2 v

6 f" K( w8 D& n! F9 [1 D============! u/ |' ]3 [5 I( b

. e. Q, a( ~/ ?1 }0 o* X1 L% ]Matlab 2009a的测试代码:
  1. f=@(x,y,z,t)x+y+z;
    * I& I# c" P; \! U8 ^. a
  2. tic;
    : T8 e- C4 o; C7 i4 F
  3. s=0;
      B2 ?1 p+ p) L1 h9 o4 M2 V
  4. for x=0:1000- |1 e8 Y% Z7 p- ~
  5.   for y=0:100
    0 f9 T9 U, d, L
  6.     for z=0:100% H* p9 i3 U/ t, D
  7.       s=s+f(x,y,z);3 z" r9 ?8 ^2 r, ?2 T( w
  8.     end
    9 [. z: k# R& o1 v, @' u" \2 e
  9.   end
    ! N+ P0 a* b- }4 N5 Z0 N) w& h
  10. end
    % A$ U6 F# R: v6 A+ X
  11. s1 S  s( @% W4 S* J
  12. toc2 V- o5 O4 {3 C+ g) v, f7 [

  13. ' I6 ]9 g# B' e
  14. s =
    # H" O( h' `8 s' Z
  15.     6.126720600000000e+009
    " ^2 K: V. V1 h) x& }9 @" g  G+ l
  16. % ?7 v$ E- s! N! f5 T) [
  17. Elapsed time is 9.546717 seconds.
复制代码
发现将函数写成m文件后效率会提高,如下例:
2 |& [. R4 A5 p4 W! y, }$ z$ U& rm函数:
  1. %file xyz.m3 d6 s% \+ H: Y# ]- e& V
  2. function c=xyz(x,y,z)5 \6 j! M; N6 F% [5 t
  3. c=x+y+z;
      [+ V8 |1 \: p6 o6 D) j+ b
  4. end
复制代码
测试代码:
  1. tic;6 K$ ^4 G1 ~: @6 @
  2. s=0;' |* e# w# E3 \  @/ S9 G
  3. for x=0:1000
    " \0 W/ w( g/ D
  4.   for y=0:100( m7 _3 T' |1 x& N0 y
  5.     for z=0:100
    ; b. Q4 j; f0 o5 j
  6.       s=s+xyz(x,y,z);+ m3 j& p( `# D) j' X5 {
  7.     end, e: @. W% X) I/ }) v7 B
  8.   end
    * }+ V  ~; z8 f5 w
  9. end- S6 [+ F) y5 K7 f8 F
  10. s) z/ v; b1 ]  I
  11. toc
    1 V0 c' o+ O$ G2 d4 W& Z6 y+ h" G

  12. ) L* n) s8 P# ~
  13. s =; o5 Q6 X4 B) H8 \5 I  [/ }
  14.     6.126720600000000e+009
    5 z- P0 u' v+ O. b, g4 r
  15. " G8 p7 d. W, [% Q
  16. Elapsed time is 4.724592 seconds.
复制代码
==========
+ |/ x5 N' Z' F6 E% _5 B, I
# X) X& s, H/ `Forcal 9(OpenFC演示)代码:
  1. f(x,y,z)=x+y+z;
    ( }( ^1 ], Y5 C" o: h' M
  2. mvar:4 ]3 E. Q( ]" P
  3. t=sys::clock(),# [4 z, Y* Q6 e
  4. s=0,
    " a" C7 s/ H: ~8 b3 f4 r
  5. x=0, while{x<=1000,
    / I% J  e$ @4 w( a0 ?. _, g3 S
  6.   y=0, while{y<=100,/ B/ i. x$ S; P# a& x& b' ^
  7.     z=0, while{z<=100,
    ! r! T* y5 `: t, y0 \* \
  8.       s=s+f(x,y,z),3 ?8 L: X% z7 T' g) X
  9.       z++$ L1 e; h7 C( r7 y' ]) }, T" o
  10.     },3 x5 A/ H# F* H2 v& v* R) H
  11.     y++
    7 F) a0 }( y, y7 n* i  @4 q. L* k& Y( }
  12.   },
    % |6 e2 {! a) [: B
  13.   x++6 y+ a, R# Y- M! a
  14. },
    ; _/ _$ i+ r  l- I4 z
  15. s;% T3 f6 J5 ~. @! x* t3 U4 b
  16. [sys::clock()-t]/1000;
复制代码
结果:
1 |& J* _) }/ d- k6126720600.+ g. A% R  ]0 W
1.109  秒
' v+ S3 i4 z; a; C$ {/ _/ c! n1 `4 j7 [: J& V7 {6 Z
二者效率有几倍的差距。
作者: ehi28    时间: 2011-12-20 02:04
嗯,不错,支持一下.
; R1 b: ]: r  K% s! Y* e2 J+ e$ Q
作者: alair005    时间: 2012-2-7 13:08
看来只有纯支持啦~~~~~~~~~~~~5724979042219687
作者: hxftntA    时间: 2019-5-28 17:44
% f" {& b$ d( V! }
6 [: O1 [# v; k1 b. |) B

! u3 {) c0 u0 p+ h! E  @' L8 ~- x3 d' u

5 y3 w3 M, K" ~9 O2 [
0 D" U0 c2 Z5 j; r6 F: d8 D
$ t; n. L. D# J+ a# g* P4 s( f. M
: T! e- {4 w* E* x0 h" r2 F

9 G5 V, [8 t9 I! p' U: u8 p8 t7 T! p- J8 }) Z1 ~& u" U; X

( U7 U9 r. t; @0 o$ h; F5 Q, m9 V, G
4 q5 o7 a* @1 O' G+ d( S* ^! F
4 y, }$ R0 \/ g5 {& A5 V4 \2 V. s% [& E
, A9 p% ?" b) Q! \! C  `, d
' P! f7 M; [9 l) [. k





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5