数学建模社区-数学中国

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

作者: forcal    时间: 2011-7-31 10:18
标题: 极限测试之Matlab与Forcal普通函数调用效率
数值计算,例如微积分、微分方程求解等存在大量的函数调用,故高效的函数调用对数值计算软件来讲是至关重要的。' |* u- b+ V7 T3 A+ Z
9 v9 a# Z7 C) y4 j4 E; `
============
/ y$ }% w8 u( T  Z- e3 Z! t
. M2 D- d" F0 y8 Q1 ^2 V: g7 x6 QMatlab 2009a的测试代码:
  1. f=@(x,y,z,t)x+y+z;
    & J$ y( S: T" w5 {* q! P* X
  2. tic;! C7 I5 _. V3 J' L  h% H: Q
  3. s=0;- j" E4 ?' X( i% J( v" e
  4. for x=0:1000
    - z! r+ ^( `) {2 M# Z  F! Z
  5.   for y=0:100
    8 z( g* C& f( E# `. r
  6.     for z=0:1006 S6 M8 c6 a+ M) M9 B
  7.       s=s+f(x,y,z);
    # T( d  L6 F- Y
  8.     end' K0 s- P: v; v+ H( q7 T2 |2 G& J
  9.   end5 _4 P" ?* _& c0 t* B3 {) R
  10. end
    1 I4 t8 G3 ~5 l# T, U
  11. s
    7 h: i, M+ V8 x& T. f8 a( L* z, K
  12. toc% |$ T( T; V6 C; x3 M( O/ ~
  13. # r  M+ \8 O  L
  14. s =
    6 {1 e2 p1 m* S. m* P9 W
  15.     6.126720600000000e+009
    4 @. M: }9 c0 |2 Q. Z( {' x
  16. ' s: P% D3 O! N! A0 I5 U& i7 E
  17. Elapsed time is 9.546717 seconds.
复制代码
发现将函数写成m文件后效率会提高,如下例:) Z9 i' Z+ b% [. \4 P
m函数:
  1. %file xyz.m. H4 A  I3 l; ^9 ?8 y
  2. function c=xyz(x,y,z)
    / I# ]2 g8 k4 O1 v$ T2 Q5 k1 d
  3. c=x+y+z;( O& x5 P4 y6 \, S) o- M9 z
  4. end
复制代码
测试代码:
  1. tic;- o2 l. d" X& J: ~
  2. s=0;
    - N, e$ O' I1 H
  3. for x=0:1000
    ; I' S' e9 B4 F- h4 M
  4.   for y=0:100
    2 l& B: f, P. x7 g8 `# s
  5.     for z=0:100$ L3 N! f  W6 C. p( r# G. G
  6.       s=s+xyz(x,y,z);; L, I, b" K: n! J& R
  7.     end  U* Y. \. i5 N, S8 |0 b$ g$ e& u
  8.   end' U6 h" z: w; p! Y/ S" t
  9. end
    % o/ J/ f, I& w/ y. `
  10. s+ M- L: {8 a" s! N6 u( H( y- v
  11. toc
    ! i4 L% e! z) V$ o9 A, ^
  12. $ s7 I3 Z# Y9 ^
  13. s =  o* m* c% X. w" l
  14.     6.126720600000000e+009
    ; x; O2 {2 o" H& D

  15. ) i5 l( p9 b) v: b
  16. Elapsed time is 4.724592 seconds.
复制代码
==========# p8 I! \7 _- x; n+ v) F

# q/ F3 e9 N: V' u2 QForcal 9(OpenFC演示)代码:
  1. f(x,y,z)=x+y+z;0 S: k$ m6 U+ f$ l2 O' Q
  2. mvar:
    7 o# R9 G0 n) a2 h6 J
  3. t=sys::clock(),
    , z6 B3 Z8 `3 V2 a( [, G
  4. s=0,
    : j- F8 ^( N3 w4 I( u
  5. x=0, while{x<=1000,
    0 Y; @# T  a& ^* c
  6.   y=0, while{y<=100,9 S! K  G/ f# W4 K7 T
  7.     z=0, while{z<=100,) }0 T  U: h' T3 h* z1 \, F8 c
  8.       s=s+f(x,y,z),
    . s+ c4 d8 t8 q8 }& b2 b) G( R$ ~
  9.       z++
    + r: q, r: ~6 f; o
  10.     },
    0 t* L; t4 N: U5 O
  11.     y++# \/ [4 H/ }: w$ f" ~1 d
  12.   },6 B4 B5 O2 ~' [8 }; N% o5 B
  13.   x++# W$ n3 ?; J8 j( N, x) a
  14. },( e- k- j3 J2 A6 ]7 |- j
  15. s;& A' ^' E- O+ A% x0 K8 s
  16. [sys::clock()-t]/1000;
复制代码
结果:
: ~# e2 P% A" [6 L7 ~( e) L6126720600.
) y: P/ J7 i( l$ E) j- E1.109  秒
5 V9 R1 D, q7 |; T( l" |. l- F- a* K# [: R4 n7 {7 c6 y; u
二者效率有几倍的差距。
作者: ehi28    时间: 2011-12-20 02:04
嗯,不错,支持一下.+ |& e+ R7 O) @

作者: alair005    时间: 2012-2-7 13:08
看来只有纯支持啦~~~~~~~~~~~~5724979042219687
作者: hxftntA    时间: 2019-5-28 17:44

* ~$ @8 ?5 P4 T
2 n$ j) t+ |' Q: W7 {3 k
" r' {( Q/ s2 E6 o# W5 P  O
# F" I, a; e: ^) I: T% b! b6 ~/ W2 P* ^5 n
( U' Y) y4 T; p) U0 O, [
$ r$ x% f. d% z  B% l7 B) Y
" ~; E) i) ~( |: H0 F4 V
4 R' a0 I! J( [: z2 t. O2 {
1 f' P( s- w% F) B
% o. t" C) @) F" W2 Z

4 q6 k- _5 z' F& D. z7 O) P6 ?% i" s; n6 H# g! h

. k+ H% T. R3 x
% j; R" m! ^# w; Y! b
; M* X& z$ y7 f, `0 c- G" Z8 |: u8 X: e* K. T





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