数学建模社区-数学中国

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

作者: forcal    时间: 2011-8-2 09:51
标题: 极限测试之Matlab与Forcal动态内存管理效率
这里用一个不太常用的小例子说明一下。
7 U5 Y; `4 v6 t1 t9 ~' J" g+ I. W& ~2 e
matlab 2009a代码:
  1. clear all6 ~1 a- j& _* Q: U, l
  2. tic
    : F0 @7 ~: ^/ {4 F9 `! F
  3. s=0;/ m3 L  A1 X8 \$ ?1 o+ X: _* s2 l
  4. for k=1:1000
    ; {7 J" ~; ]3 a6 c# _* S
  5.   for i=1:10001 \! {# g% l" i) e9 [6 T, S
  6.     a=linspace(2,2,1000);6 G1 ?6 s- _7 ^. A/ ?# P  \
  7.     s=s+a(i);
    3 h& W, ^6 M( \" n% v
  8.   end
    * g/ a0 t6 t- o' j! Q  [7 ?
  9. end' b9 x* H* \$ n! n2 }
  10. s; ]4 r( v/ Q) _
  11. toc
    / x/ ]+ F7 l/ D5 v* S
  12. ( n& S2 s7 ~! f* h4 V- w, x- g
  13. s =
    3 Q" L3 g0 B2 G2 K) O/ x

  14. # \1 @1 e1 r7 a( `
  15.      2000000) E  g! A7 w$ w9 c" Y

  16. ( N) t& `! u1 h3 w$ P
  17. Elapsed time is 18.325900 seconds.
复制代码
程序运行时内存比较稳定。8 [! w. Y+ D* b0 {  c  j5 t
0 d/ s" X1 E8 Q4 H( ^1 o8 ?; b
--------; W. j0 j/ @: q  J, p  p
6 o5 s( I. k/ M9 m" ~4 R
Forcal代码:
  1. !using["math","sys"];
    4 s6 s; F/ x1 S! T  n  k
  2. mvar:
    - t5 r) [! s1 y# {
  3. main(:a)=' }% G, D; o( _3 N& X
  4. t0=clock(),
    ( g  n: w! K2 n
  5. s=0,4 ~* q' J3 s: L( I. {( @. X  R+ A
  6. k=0, while{k<1000,
    6 K* L3 j5 |% s: q
  7.   i=0, while{i<1000, a=linspace(2,2,1000), s=s+a.i, i++},  // 嗯,a.i 就是 a(i)
    % N5 c5 ^0 L/ ^' D" `- M
  8.   k++
    + B) A2 I+ l" _5 T
  9. },+ y2 a0 b0 f& @: v
  10. s;7 u, |9 }2 x* y8 \- h0 M- |0 Z  g: I
  11. [clock()-t0]/1000;
复制代码
结果:. k, ?% P9 B/ b+ R* N
2000000.2 @$ V. R3 {. b( K  ^- Y
40.766 秒" q) u- h2 a% c; V0 b/ M+ `' s( v
" p) ?& H  Z  Z  J6 |4 Y* s
程序运行时内存不稳定,时大时小。该程序导致Forcal垃圾收集器启动约10次,垃圾收集前内存消耗大,垃圾收集后内存小。; h2 i6 Z$ j* b' j5 N4 u' I3 h. W2 C
因垃圾收集器多次启动,故耗时较长。
; x: e0 _$ g3 l- W: P  ~* e3 @
; ?5 E& {: X, J8 V------------, b: c- v4 J( Z" [

$ K; Q1 I; y/ p7 y以下将a=linspace(2,2,1000)放到了oo{  }函数中:
  1. !using["math","sys"];- K7 K6 y# E1 e, w
  2. mvar:
    ( A8 s# w+ e; h3 Q( a2 R! c
  3. main(:a)=6 d# z9 q# f! y- G3 I8 O  x" I
  4. t0=clock(),
    & g0 S2 I) c" \) m) f2 h% Y7 A9 y2 H
  5. s=0,* h5 j' o4 f! c* R1 L  B1 z
  6. k=0, while{k<1000,! B3 @9 L8 O4 X& l; n
  7.   i=0, while{i<1000, oo{a=linspace(2,2,1000)}, s=s+a.i, i++},  // 嗯,a.i就是a(i)3 _. a' K9 Z  @6 f% T' L  S
  8.   k++
    $ r; [. F8 a0 m! U# ]
  9. },
    - ?, ~* x- I0 F, h
  10. s;: y+ n. X* E6 g2 Q3 j) w
  11. [clock()-t0]/1000;
复制代码
结果:4 E) G# s, e$ n9 H+ d& n& C( i
2000000.
9 g4 k- Y/ i" V* N1 U% x4.609 秒
& W. q1 ?- F8 l5 V/ F/ d6 P# J4 V$ n; y7 |, Z
可以发现,Forcal耗时大大减少了,远小于matlab耗时,这要归功于oo{ }函数。
% U5 u' ]# K9 A* T9 o2 w- o在Forcal中,函数oo{ }不仅提供了运算符重载功能,而且会自动高效地回收垃圾。通常,所有涉及到对象的代码都要放到函数oo{ }中。
作者: 我就在你背后    时间: 2011-8-2 16:08
太强大了 看不懂啊
作者: forcal    时间: 2011-8-2 18:18
我就在你背后 发表于 2011-8-2 16:08 ) A( [. |9 m" |1 X
太强大了 看不懂啊
! v) d7 U- d( O9 v3 s! F1 o' V
函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forcal如何处理垃圾对象和进行内存管理。
作者: 我就在你背后    时间: 2011-8-2 22:57
forcal 发表于 2011-8-2 18:18
$ l# ^4 S) p6 R& l7 i8 [  c函数linspace(2,2,1000)放到循环里,每循环一次就会产生一个垃圾对象(一维数组),主要对比Matlab和Forc ...
# c! e* G) R' o% O+ j' J( L
恩 我在研究研究,谢谢了
作者: sxjm567    时间: 2012-7-14 11:19
我反复看了多遍,好帖,得支持




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