如何解读Rebol 3中的统计数据/节目

时间:2015-02-24 16:08:46

标签: rebol3

想要对R3脚本进行一些分析,并且正在检查stats命令。 但这些信息意味着什么呢? 如何用它来监控内存使用情况?

>> stats/show
Series Memory Info:
  node   size = 16
  series size = 20
       5 segs =  409640 bytes - headers
    4888 blks =  812448 bytes - blocks
    1511 strs =   86096 bytes - byte strings
       2 unis =   86016 bytes - unicode strings
       4 odds =   39216 bytes - odd series
    6405 used = 1023776 bytes - total used
       0 free /   14075 bytes - free headers / node-space

Pool[ 0]    8B   202/ 3328: 256 ( 6%) 13 segs,   26728 total
Pool[ 1]   16B   178/  512: 256 (34%)  2 segs,    8208 total
Pool[ 2]   32B   954/ 2560: 512 (37%)  5 segs,   81960 total
...
Pool[26]   64B     0/    0: 128 ( 0%)  0 segs,       0 total
Pools used 654212 of 1906200 (34%)
System pool used 497664
== 1023776

2 个答案:

答案 0 :(得分:3)

它显示内部内存管理信息,不确定它对脚本有多大用处。

无论如何,这里有一些关于内存池的解释。

大多数游泳池用于系列游戏(有一个专门用于GOB的游戏!如果您正在查看Atronix源代码,还有一些其他游戏池),为了简单起见,我将重点关注系列游戏池。

在内部,一个系列有一个标题及其数据,它是一块连续的内存。标题包含有关系列的宽度和长度信息。数据包含系列的实际内容。在R3中,Series广泛用于实现block!,port!,string!,object!等。因此在R3中管理内存几乎是管理(分配和销毁)系列。由于系列的宽度和长度不同,因此引入了池以减少碎片。

当需要新系列时,标头将在特殊池中分配,并为其数据选择另一个池。选择宽度接近系列大小的池。例如。具有3个元素的块可能会在宽度为128字节的池中分配(在32位系统上,块是具有4(3 + 1个终结符)元素的系列)。随着程序运行,池可能会增加,它将作为段列表实现。新的段将根据需要分配并附加到列表中(但它永远不会释放回系统)。

另一个特殊池是系统池,在所需内存很大时选择。除收集一些统计信息外,R3实际上并不管理此池。

当它试图收集垃圾时,它将扫描根上下文,并标记所有可以访问的内容,然后它将通过系列标题池,找出所有不需要的系列并销毁它们。

答案 1 :(得分:1)

如果您使用统计信息而不进行细化,则可以看到实际的内存使用情况。因此,比较实现之前和之后的内存使用情况,您可以看到哪一个使用更少的内存。

>> stats
== 1129824

>> s: make string! 1024
== ""

>> stats
== 1132064