数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-2 09:51
标题: 极限测试之Matlab与Forcal动态内存管理效率
这里用一个不太常用的小例子说明一下。0 w/ M8 M2 J, U% i& P
9 s$ X8 w! f# T1 J
matlab 2009a代码:
  1. clear all
    ; D! E' n4 i* W" c( |% M
  2. tic
    ; }& z1 ~% o  R6 I
  3. s=0;  d9 u( _4 k5 ~$ |! ?
  4. for k=1:1000- s- p7 W, s2 q
  5.   for i=1:1000  \0 M6 {9 l2 L. p, s+ J
  6.     a=linspace(2,2,1000);
    8 V/ v5 Z9 O! o- r
  7.     s=s+a(i);" y: w  q" J* x% Y* _9 F& y* d* p
  8.   end+ f; t6 \" |/ w) Q/ a( w. B
  9. end6 P  c( \) d7 ?* a
  10. s
    5 C4 j) i8 ]( e* F! |
  11. toc
    : Z6 j; H) X$ ^3 e9 |+ ?
  12. * o* q0 N9 e+ l" ~& ^' b& O
  13. s =
    & d6 c* l% x+ v# W% D8 h# a
  14. , M/ v- P$ j; X) f- _
  15.      2000000/ R( f1 a! P9 e7 W

  16. , H2 ~3 {& P; W( z" L/ t
  17. Elapsed time is 18.325900 seconds.
复制代码
程序运行时内存比较稳定。
: i' m0 Q! H1 M6 ]7 ?
9 o2 e0 b% A! A! p8 Q: ~' K5 k! n$ R--------  N% v! l' I& A* L) ?: h

( U' F+ D, t! U5 t. b% xForcal代码:
  1. !using["math","sys"];
    * F) I0 u  m& x* ^+ W
  2. mvar:
    : ]6 L& X# c. j
  3. main(:a)=
    $ A3 r7 B2 {* B3 j
  4. t0=clock(),1 K6 n! n) e- j9 ?
  5. s=0,
    * U1 W( f6 L; v0 }
  6. k=0, while{k<1000,
    3 c2 h9 s, B6 I# i4 b7 W* ~
  7.   i=0, while{i<1000, a=linspace(2,2,1000), s=s+a.i, i++},  // 嗯,a.i 就是 a(i)# r. {, g5 `" a( x
  8.   k++! w: z/ c- G* i
  9. },, x7 X3 z" D2 z/ |9 ~
  10. s;
    7 T8 E3 V/ e" C# x/ K
  11. [clock()-t0]/1000;
复制代码
结果:6 N4 J, ^& h0 C9 p6 j
2000000.+ ~! n0 h/ F- W( y2 m, j
40.766 秒
8 e- O7 c- \/ _0 N3 A
6 D; y: N' q3 J/ f: }# I" o& e+ W6 D! u程序运行时内存不稳定,时大时小。该程序导致Forcal垃圾收集器启动约10次,垃圾收集前内存消耗大,垃圾收集后内存小。
+ v- y3 A2 F7 [- j4 f因垃圾收集器多次启动,故耗时较长。
3 p. F& _8 L7 D: D( C2 j7 e4 \2 }9 m4 m/ I8 M8 Q- d* w, W- K
------------& N9 \' R% j- z6 a

3 M8 O' p: C% A. y/ ?以下将a=linspace(2,2,1000)放到了oo{  }函数中:
  1. !using["math","sys"];' a& ^) h( b9 S" \
  2. mvar:
    ( W. N7 n9 ~5 e% @' [  I% k* z4 m
  3. main(:a)=/ S  l* C. W0 y1 d* V5 x
  4. t0=clock(),# B% W9 y! }" D; Z4 O4 G4 J
  5. s=0,9 y' d' k# W6 w3 e: u
  6. k=0, while{k<1000,
    6 z) |% b7 Q1 b- Q* A  U$ c
  7.   i=0, while{i<1000, oo{a=linspace(2,2,1000)}, s=s+a.i, i++},  // 嗯,a.i就是a(i)' u' W- {# H7 t- T0 e8 U9 R
  8.   k++4 G0 Z( ^& x+ H
  9. },
    , S0 Z4 Y. l& Q/ \3 n. C8 e; w
  10. s;
    / C5 ~, y% u& m" O+ s, D/ Q! [$ {
  11. [clock()-t0]/1000;
复制代码
结果:; a  y% p, ~$ @  B
2000000.  t( s  z4 [% g) a/ v. H
4.609 秒8 A2 I; [, ?5 E

9 V7 j. w5 m0 _9 [& l8 P可以发现,Forcal耗时大大减少了,远小于matlab耗时,这要归功于oo{ }函数。
+ d  W, `8 b& M& T( d在Forcal中,函数oo{ }不仅提供了运算符重载功能,而且会自动高效地回收垃圾。通常,所有涉及到对象的代码都要放到函数oo{ }中。
作者: 我就在你背后    时间: 2011-8-2 16:08
太强大了 看不懂啊
作者: forcal    时间: 2011-8-2 18:18
我就在你背后 发表于 2011-8-2 16:08
, q* h0 `# Y4 }6 t0 y& x  t太强大了 看不懂啊

) y- F8 }* A2 D, _% m函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forcal如何处理垃圾对象和进行内存管理。
作者: 我就在你背后    时间: 2011-8-2 22:57
forcal 发表于 2011-8-2 18:18 * F( l8 J$ p* d7 ~; n
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forc ...
; `. G5 H7 D0 k; P8 q/ K" W/ ], A- h
恩 我在研究研究,谢谢了
作者: sxjm567    时间: 2012-7-14 11:19
我反复看了多遍,好帖,得支持




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