数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-2 09:51
标题: 极限测试之Matlab与Forcal动态内存管理效率
这里用一个不太常用的小例子说明一下。
: D! Y. ]1 V# g
/ Y1 x3 n1 x' I' [. p/ omatlab 2009a代码:
  1. clear all
    6 u) D% B* e# K. \' W0 A
  2. tic, r2 Q! ]2 f/ D# y4 V7 K" H
  3. s=0;& R7 x  a/ t: m$ K5 U
  4. for k=1:1000+ r: t1 k+ k! M: \
  5.   for i=1:1000) c, [$ a' o4 E  t- ?4 l
  6.     a=linspace(2,2,1000);
    1 o7 N# k9 A* S0 W
  7.     s=s+a(i);% u( d" R( ~2 M$ {$ A4 p0 s7 J
  8.   end0 h! F) T$ j% h+ J" }  [. J
  9. end
    % O" l- }+ [$ n& E0 f* u+ T
  10. s
    # p7 N- Q" q8 h) H/ B. f
  11. toc
    . B2 M0 S# u- l  Y
  12. $ b" S( U. ?: _: B4 q0 Q; f# @
  13. s =
    0 s% c8 N: X( i

  14. 9 Q  G7 I) ^, a
  15.      2000000
    6 n7 D% X$ G# ]( V

  16. ' g' V! H4 k4 y4 k% ]$ m: m
  17. Elapsed time is 18.325900 seconds.
复制代码
程序运行时内存比较稳定。
+ y! f) Q+ n' ~5 [7 ?9 o* l" d) R
: l! e$ W: S( a+ k--------
- d) k) X; f) q+ j
0 ~4 v6 f$ f: D+ k2 ]2 WForcal代码:
  1. !using["math","sys"];
    " J, {* e2 Z9 v* O
  2. mvar:0 m, z, F. b  ?/ U( l$ L+ ?$ K) v' x
  3. main(:a)=
    3 u4 e4 ~1 q# a3 K0 X
  4. t0=clock(),, D7 w- E9 t; N5 w
  5. s=0,
    9 {$ m4 }, s5 s2 ?4 f5 t; q& E
  6. k=0, while{k<1000,
    9 D0 C9 z# i1 ~1 L
  7.   i=0, while{i<1000, a=linspace(2,2,1000), s=s+a.i, i++},  // 嗯,a.i 就是 a(i)' s% B% e5 b9 S8 e% b
  8.   k++) C) V5 y$ |# |* N, Z
  9. },8 B4 _& H: w, |
  10. s;
    + ~+ t# n, s7 Q* V) x! t
  11. [clock()-t0]/1000;
复制代码
结果:1 e5 N% K. x5 m/ T% D6 W" u1 h
2000000.* V: }2 @1 z" n) U2 e
40.766 秒% n: n+ u" ?9 _3 j

8 z( ~  t) j3 \) c+ o# b  I程序运行时内存不稳定,时大时小。该程序导致Forcal垃圾收集器启动约10次,垃圾收集前内存消耗大,垃圾收集后内存小。% a9 l9 C: `2 l* Z
因垃圾收集器多次启动,故耗时较长。3 p7 a1 t" _. R1 u) s

, A9 a; R1 ]; d------------% Y7 a8 i; ~+ i: Q" y6 T
5 z+ \+ R. Y) J% Z9 S) S
以下将a=linspace(2,2,1000)放到了oo{  }函数中:
  1. !using["math","sys"];' f1 z# H( F) }, b* ~) c
  2. mvar:& l; I' i4 ]6 P! x0 P8 I* Z
  3. main(:a)=" G3 m. J* k, Q
  4. t0=clock(),
    5 q9 A  Z/ q2 q# E, A: m6 j
  5. s=0,
    3 w" b5 ^7 b- m( b9 z
  6. k=0, while{k<1000,
    0 ]7 R; ]2 E3 Q* o) G& m) p$ p% P
  7.   i=0, while{i<1000, oo{a=linspace(2,2,1000)}, s=s+a.i, i++},  // 嗯,a.i就是a(i)# H$ t) B1 R! |* M
  8.   k++
    4 s: R. p1 j) E$ [, ~
  9. }," P  [7 e$ _& y+ S( p, T  S
  10. s;1 U4 E, y: r$ u$ ]7 w
  11. [clock()-t0]/1000;
复制代码
结果:3 N6 C5 e0 y. `9 E6 M' L
2000000.+ }% v& a, _  t% |! e& j% S
4.609 秒
$ j) S- k' ~! V
) P6 B: T/ W6 c+ q3 P  ?可以发现,Forcal耗时大大减少了,远小于matlab耗时,这要归功于oo{ }函数。
) P8 b+ Y2 u3 k4 Q- |在Forcal中,函数oo{ }不仅提供了运算符重载功能,而且会自动高效地回收垃圾。通常,所有涉及到对象的代码都要放到函数oo{ }中。
作者: 我就在你背后    时间: 2011-8-2 16:08
太强大了 看不懂啊
作者: forcal    时间: 2011-8-2 18:18
我就在你背后 发表于 2011-8-2 16:08
) X5 b% x5 R4 d( i. n2 E, w太强大了 看不懂啊

8 q1 R: l2 S2 \3 q6 A( P函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forcal如何处理垃圾对象和进行内存管理。
作者: 我就在你背后    时间: 2011-8-2 22:57
forcal 发表于 2011-8-2 18:18 ' W0 Y4 v5 n4 F" l" N
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forc ...

$ k- g  ]& l) K0 m恩 我在研究研究,谢谢了
作者: sxjm567    时间: 2012-7-14 11:19
我反复看了多遍,好帖,得支持




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