数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-2 09:51
标题: 极限测试之Matlab与Forcal动态内存管理效率
这里用一个不太常用的小例子说明一下。
% n- p6 `: h8 k9 b  g+ [7 k1 v3 h: A$ @
matlab 2009a代码:
  1. clear all
    0 k  v& `: U: F# p. o# L
  2. tic
    # k  P  P/ q+ H" f7 V) v* d. \# z
  3. s=0;( ]7 G/ _8 A# E3 _
  4. for k=1:1000; L5 o+ I% L8 y2 \5 i1 ^
  5.   for i=1:1000
    " r" `5 o: B* X. a2 ~& P
  6.     a=linspace(2,2,1000);
    , i( o; u, H- r$ ~4 b
  7.     s=s+a(i);
    7 `. L4 ^8 D9 a6 V% m! A$ R8 b
  8.   end
    9 m" p/ e. o3 N2 y& k& L* r
  9. end
    6 x  t4 N0 w" ~3 _
  10. s# A2 ^3 z1 ]1 y' w2 L0 k
  11. toc
    ( X& M/ o  e: o, U2 I

  12. ' u3 h* q6 f: Y; p, @; ~
  13. s =' F+ `& S- t' E  G) v
  14. " I4 z" v8 K" Q
  15.      2000000& `! f& b! g3 A2 K% Z( x
  16. 6 ^* U* c0 G7 e4 M" [
  17. Elapsed time is 18.325900 seconds.
复制代码
程序运行时内存比较稳定。
  j) B( ^& ~- X! c1 W
8 |3 k( E! S- ^1 U1 B, d2 K--------9 d$ W0 W2 f: F  C5 m* q6 I# s
, `$ a5 c& r( z4 O
Forcal代码:
  1. !using["math","sys"];
    1 [) J1 m! d& m1 b/ t3 q" e
  2. mvar:
    , f8 N; K" m( }% H/ }) H
  3. main(:a)=  y( M  A/ y) ]; A: `6 F8 u
  4. t0=clock(),; @! h0 u3 f  f- a% B
  5. s=0,
    9 H! O9 F1 W5 |) c7 e
  6. k=0, while{k<1000,
    6 M, o$ K/ o$ ]9 t
  7.   i=0, while{i<1000, a=linspace(2,2,1000), s=s+a.i, i++},  // 嗯,a.i 就是 a(i)0 h- z& c& Z$ Q
  8.   k++' Q8 x8 d/ ^# }0 n1 z  g- B
  9. },6 M5 Q: J. V( R9 z0 r4 a
  10. s;
    2 z  W/ J+ B! o/ l" ~* w
  11. [clock()-t0]/1000;
复制代码
结果:
$ Q/ F  v8 w' B* I' ]1 C, V  Y; b2000000.: M8 b. I0 X/ x+ F8 u4 z. N4 Y
40.766 秒& I' E7 M7 x' j0 t& v3 j

) j3 k5 C5 Y- P程序运行时内存不稳定,时大时小。该程序导致Forcal垃圾收集器启动约10次,垃圾收集前内存消耗大,垃圾收集后内存小。
4 Q2 s! N3 X# y' s5 U因垃圾收集器多次启动,故耗时较长。
- N0 R8 |4 O! @- [6 j% Q
! H2 q4 }5 Y7 v------------
, Z4 q, J7 M" e6 u
  v* L0 O3 b  n% Y7 W4 W以下将a=linspace(2,2,1000)放到了oo{  }函数中:
  1. !using["math","sys"];0 y" ~9 ]2 n1 ^# l) @6 A) a! R/ _* x
  2. mvar:
    + |* M, g! o4 N; ^1 J% B3 W- y
  3. main(:a)=. _: S6 c2 D7 T9 \$ ?4 b( q
  4. t0=clock(),; `$ c2 R/ w' i
  5. s=0,
    * _7 @! k$ S: A$ E: w+ v
  6. k=0, while{k<1000,
    ' g& B& O! t1 ^% M! N' J; Y: K
  7.   i=0, while{i<1000, oo{a=linspace(2,2,1000)}, s=s+a.i, i++},  // 嗯,a.i就是a(i)
    * d/ c8 l% h! T, ~7 K& p: W* m8 `
  8.   k++( @' l9 ]8 \7 p
  9. },) X) \  G2 V# o5 p% S( s
  10. s;+ h( s" M, T4 @7 m& c# r9 A
  11. [clock()-t0]/1000;
复制代码
结果:" K0 w# Q. g9 l8 e4 S" h
2000000.
' d; l! {/ i4 T5 v8 |! X4 G4.609 秒
' q0 b9 Q6 V* A9 t' w, ~- ~+ F
可以发现,Forcal耗时大大减少了,远小于matlab耗时,这要归功于oo{ }函数。( k) ~6 m% ^3 l- D6 _+ P4 t7 K: W
在Forcal中,函数oo{ }不仅提供了运算符重载功能,而且会自动高效地回收垃圾。通常,所有涉及到对象的代码都要放到函数oo{ }中。
作者: 我就在你背后    时间: 2011-8-2 16:08
太强大了 看不懂啊
作者: forcal    时间: 2011-8-2 18:18
我就在你背后 发表于 2011-8-2 16:08 7 v6 n# B6 K, q, }7 e% n
太强大了 看不懂啊
+ e. {. E, q2 G- X+ O
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forcal如何处理垃圾对象和进行内存管理。
作者: 我就在你背后    时间: 2011-8-2 22:57
forcal 发表于 2011-8-2 18:18 ' r% ?. T; f- R. h  U
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forc ...
. K3 t) J# g# ?5 i# B% I
恩 我在研究研究,谢谢了
作者: sxjm567    时间: 2012-7-14 11:19
我反复看了多遍,好帖,得支持




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