数学建模社区-数学中国

标题: 极限测试之Matlab与Forcal动态内存管理效率 [打印本页]

作者: forcal    时间: 2011-8-2 09:51
标题: 极限测试之Matlab与Forcal动态内存管理效率
这里用一个不太常用的小例子说明一下。
* M$ }8 o9 A+ B2 _- j5 o
. ]; u. W" N5 O2 ?matlab 2009a代码:
  1. clear all( D$ E1 s9 a1 P# x) h
  2. tic# Q0 H0 Q0 ?( U) K" D1 d
  3. s=0;( e3 E5 ]+ P9 N/ j. ^# k1 x1 s9 S. C
  4. for k=1:1000( F: x, w9 c7 _3 n! U
  5.   for i=1:1000
    , T  D+ e! _5 u7 Y: l, G: w; |
  6.     a=linspace(2,2,1000);1 s9 B6 E- r/ I. W) s% `
  7.     s=s+a(i);
    7 d# B8 C* v* {
  8.   end9 p& i5 {. o$ Y- n& j# N, `
  9. end8 O' _) `7 O9 V
  10. s
    ; x0 Q/ h9 _; A* k) M3 Y. p2 c& i& M; p
  11. toc* {# O% B4 J  p( D/ p/ k% G  o$ O- Q

  12. / i7 o1 K- }7 @  ~8 x5 O. o
  13. s =4 J0 b& F2 v2 o3 @: a

  14. & G7 e) V6 b1 p. ^; t0 Y
  15.      2000000* m/ v# W( t" ?6 f
  16. 4 v' w- r+ a3 k- v! _8 r
  17. Elapsed time is 18.325900 seconds.
复制代码
程序运行时内存比较稳定。
8 J9 g: O$ w6 E' @+ x% G7 {) D9 L$ h3 q, ]" b/ {, m1 h. Z# E
--------, K! H4 V" e2 d& X, ~9 O

8 S1 T) j7 g" [) v  A- V. D9 D4 FForcal代码:
  1. !using["math","sys"];
    4 W/ H5 N: i' ~
  2. mvar:
    ( J& Y' n: ?4 Q& Q9 Q
  3. main(:a)=
    2 M" p9 F2 e& G; z8 C/ J  _: {
  4. t0=clock(),
    2 B9 W& K! w# j" W- K9 F7 L
  5. s=0,3 P5 H; u9 y. t: d; t
  6. k=0, while{k<1000,
    . G4 s  D$ [- `% u# m
  7.   i=0, while{i<1000, a=linspace(2,2,1000), s=s+a.i, i++},  // 嗯,a.i 就是 a(i)/ C/ _. D% _. d6 s" [, a
  8.   k++
    # z- a/ E% t8 _- c6 F* y
  9. },8 x0 u. }$ Z( v% O( O% h5 }, Y
  10. s;* m, V5 Q4 }" i+ \5 V
  11. [clock()-t0]/1000;
复制代码
结果:, z4 |/ M+ z2 H* n$ U
2000000.7 M' l6 ]! K' k: I0 I5 |' w5 v
40.766 秒
7 Q& p- U0 S: E  s; @) H: j& D- y* m) O( b
程序运行时内存不稳定,时大时小。该程序导致Forcal垃圾收集器启动约10次,垃圾收集前内存消耗大,垃圾收集后内存小。
4 `/ S4 {0 \3 P因垃圾收集器多次启动,故耗时较长。
$ Y; C# B: ?$ F. G7 `" C7 `- t  ~2 N) k, e6 H$ x4 H0 x/ X
------------. c8 _# T) P- d& ]$ z
' U/ H1 x6 a  p* s' J& D7 W6 i
以下将a=linspace(2,2,1000)放到了oo{  }函数中:
  1. !using["math","sys"];3 ~* n, G+ p$ O2 ^4 a( `, c
  2. mvar:
    % Z$ N! O9 M$ R% U
  3. main(:a)=+ J7 I# D# k! O
  4. t0=clock(),
    # u) ^! \, l9 }; h, g( Z
  5. s=0,
    ! O, V) V4 X# W  e
  6. k=0, while{k<1000,: N  j+ i; H+ D' s; ^( _+ g8 Y3 A
  7.   i=0, while{i<1000, oo{a=linspace(2,2,1000)}, s=s+a.i, i++},  // 嗯,a.i就是a(i)
    * ?$ V+ F2 D( B! k2 Y
  8.   k++
    8 ^6 K/ N6 }# v; A8 i- Z
  9. },
    3 d0 @" j- O6 ?; c/ x  w6 V0 i1 o; J4 J
  10. s;
    * i- c: Y1 |/ y' A- Q1 k$ u6 X8 D
  11. [clock()-t0]/1000;
复制代码
结果:) g2 t4 k) b- ~+ }' W7 q
2000000.
/ I0 T* X, q. Z, `# g, t- `4.609 秒
% G6 t" L5 _8 O& \# N
- g/ u! s/ U' M% c% M% J可以发现,Forcal耗时大大减少了,远小于matlab耗时,这要归功于oo{ }函数。) G, S- K2 Q. U6 o
在Forcal中,函数oo{ }不仅提供了运算符重载功能,而且会自动高效地回收垃圾。通常,所有涉及到对象的代码都要放到函数oo{ }中。
作者: 我就在你背后    时间: 2011-8-2 16:08
太强大了 看不懂啊
作者: forcal    时间: 2011-8-2 18:18
我就在你背后 发表于 2011-8-2 16:08 / A% y0 f) f! ^. b7 y# o
太强大了 看不懂啊
* q, u3 J8 e; Y. @
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forcal如何处理垃圾对象和进行内存管理。
作者: 我就在你背后    时间: 2011-8-2 22:57
forcal 发表于 2011-8-2 18:18
% f( M: w" L' w- R/ m0 D) z+ D& l3 e函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forc ...

. i+ {& y" ^6 A- W5 U恩 我在研究研究,谢谢了
作者: sxjm567    时间: 2012-7-14 11:19
我反复看了多遍,好帖,得支持




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