Rebol3 如何解释Rebol 3中的统计/显示

Rebol3 如何解释Rebol 3中的统计/显示,rebol3,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

想要在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

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

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

大多数池都是用于series的(有一个专门用于GOB!s的池,如果您正在查看Atronix源代码,还有一些其他池),为了简单起见,我将在这里重点介绍series池

在内部,一个系列有一个头和它的数据,这是一个连续内存块。标题包含有关系列的宽度和长度信息。数据保存了该系列的实际内容。在R3中,系列广泛用于实现block!,港口!,一串对象所以在R3中管理内存几乎就是管理(分配和销毁)系列。由于序列的宽度和长度不同,引入了池以减少碎片

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

另一个特殊的池是系统池,它是在所需内存较大时选择的。R3除了收集一些统计数据之外,实际上并不管理这个池


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

如果使用stats而不进行优化,则可以看到实际的内存使用情况。因此,通过比较实现前后的内存使用情况,可以看出哪一个使用更少的内存

>> stats
== 1129824

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

>> stats
== 1132064

谢谢你的详细解释。事实上,我的目标是检查一个实现使用了多少内存,并与另一个实现进行比较。使用stats命令,这似乎很难实现,因为它是基于统计的。这可能会给您一个粗略的想法,但远不准确:1)它只计算序列,这意味着忽略了gob占用的内存;2) 它计算一个系列的总空间,即使部分使用。请参阅core/n-system.c中的NATIVE(stats)和core/m-pools.c中的Inspect_系列