数学建模社区-数学中国

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

作者: forcal    时间: 2011-7-31 10:18
标题: 极限测试之Matlab与Forcal普通函数调用效率
数值计算,例如微积分、微分方程求解等存在大量的函数调用,故高效的函数调用对数值计算软件来讲是至关重要的。7 b+ T8 [+ L1 i9 M! E, {
% J: Q4 E" ]6 {, A
============
3 I* _; F1 x2 ~! j1 d8 a" ]' p2 Z7 k% S- O1 }
Matlab 2009a的测试代码:
  1. f=@(x,y,z,t)x+y+z;
    ' U. J0 Q7 B( Y( c
  2. tic;
    # t% S! `3 o9 f1 D  O- ^
  3. s=0;8 ~1 @* S3 h" a" b
  4. for x=0:1000
    4 C+ K$ S8 s# m, B3 r
  5.   for y=0:100/ m7 O- [" }5 J7 |7 v# h* G
  6.     for z=0:100# {( C% l$ H8 m% {) K. J
  7.       s=s+f(x,y,z);
    , j; u, i$ F, \9 Y% b$ w
  8.     end3 X6 l% n# ]7 _2 X0 v; P3 m
  9.   end5 c$ C2 [6 ~' O% O6 z
  10. end  O: O! z- z7 N+ H4 f
  11. s
    * w9 D% z) Z4 P% M  O- X
  12. toc
    6 [7 [8 H; P- {" o* ]* U
  13. 2 t% T0 s& Y1 ~: B
  14. s =, G+ X7 E- ~( [  I$ c+ G  s
  15.     6.126720600000000e+009
    ( m: f% m2 j; {- t, |$ P5 Z
  16. / H7 ~, }" I8 b' Q1 W9 F
  17. Elapsed time is 9.546717 seconds.
复制代码
发现将函数写成m文件后效率会提高,如下例:
7 |1 s+ {: @  u. b/ E* Im函数:
  1. %file xyz.m9 e1 a' g; \) K% c2 d6 ?. i9 D
  2. function c=xyz(x,y,z)
    9 m$ _4 A' e9 P2 D2 p$ M
  3. c=x+y+z;
    ( o/ ~( {2 }7 o" M. ~
  4. end
复制代码
测试代码:
  1. tic;2 ]4 U1 ?9 y: P
  2. s=0;/ J' t0 o  c  Q) N
  3. for x=0:1000/ e2 v3 M3 n2 I% R: V
  4.   for y=0:100
    : X3 |2 I9 l6 T6 |( }" a/ H
  5.     for z=0:100& j+ `7 }7 a. M; d$ ^
  6.       s=s+xyz(x,y,z);" s' V# [! t! H
  7.     end
    * Y# `; U3 _8 r; C
  8.   end
    ' b  `8 U# P8 N+ a
  9. end
    ( K8 K% L+ b$ ]# i
  10. s& L% N# [/ |' P  h0 Q6 `
  11. toc
    / K+ ]3 P/ g9 z- ~" V
  12. % N' g' x  u2 A
  13. s =9 z$ I% T( p) B: X
  14.     6.126720600000000e+009
    ( q. w# i/ X6 S- P

  15. ! `0 y$ d" a3 D5 n2 U2 J0 k, U
  16. Elapsed time is 4.724592 seconds.
复制代码
==========
8 I) p3 S6 {2 n4 W
( [' m/ D# x& K' S( C+ G% ]; g, jForcal 9(OpenFC演示)代码:
  1. f(x,y,z)=x+y+z;' s9 R  P% E& o. [& {
  2. mvar:, g( k, x9 E! u0 Q1 ~) m
  3. t=sys::clock(),
    $ R' p% G/ P/ e' D6 g: N
  4. s=0,
    4 X) p- Y- v+ n( \$ F/ h1 ]0 p
  5. x=0, while{x<=1000,2 x/ a# S0 L+ e( J
  6.   y=0, while{y<=100,; V* v+ `- @+ P4 P" x# C/ d
  7.     z=0, while{z<=100,- T6 o* {% I; _$ @
  8.       s=s+f(x,y,z),
    + Q6 k2 R/ k9 t/ n% Y
  9.       z++
    " s+ \4 I* s+ u" ]7 W; m
  10.     },( U6 L5 h. c( Z" y* {3 ~
  11.     y++. K3 r$ J& q9 D; l! l/ S
  12.   },( h7 @# U2 M5 A2 S+ A, N
  13.   x++! U9 I# v. [* `. E3 Y% ]! c% [
  14. },6 j. Y& J. T& }+ L: @7 P9 f% K
  15. s;" J& B0 M4 K; p
  16. [sys::clock()-t]/1000;
复制代码
结果:
( ]5 k$ T5 V) Y$ C* \, |6126720600.
1 Z" c) c# w5 F, Z) O# z0 }1.109  秒
# j4 F  a) n  \$ Y  }) ]3 U6 k+ ^, O
二者效率有几倍的差距。
作者: ehi28    时间: 2011-12-20 02:04
嗯,不错,支持一下.! s* U* H; C' S

作者: alair005    时间: 2012-2-7 13:08
看来只有纯支持啦~~~~~~~~~~~~5724979042219687
作者: hxftntA    时间: 2019-5-28 17:44
1 o% T6 @0 z1 l! v# K
; ^0 X! T& k7 z( r

4 ^  Q5 e8 g0 X7 _
0 f1 {/ K. p7 ?: H. L6 l
% {# w4 i7 V  N0 p8 v) J9 z7 s+ c) y' B2 x6 m
% h; B* q/ }% }

/ w5 U' p" G" z$ r% D" d+ M3 }' `) H: A8 m0 [7 E* J& W" F
1 ^% u8 l9 m( ~! e: Q/ a
: w+ B: v. s# ^% M
/ S8 d8 k* p! b$ g% J  T

: v* B/ s8 U% ~8 K" F4 ^' c# v( o/ L: f# t5 E! z

7 G9 j- r" n9 y% Y
/ n6 r; z1 @2 {. S( C& g
. I7 }7 ^4 C6 G5 a- Z




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