为什么gprolog需要这么多内存?

z_a*_*xis 1 prolog gnu-prolog

以下是来自top命令:

                            size  res 
1127 ***       1  20    0   117M  2196K ttyin   0   0:00  0.00% gprolog

1149 ***       1  23    0 10700K  3728K ttyin   0   0:00  0.00% swipl
Run Code Online (Sandbox Code Playgroud)

它的RES是合理的,但与swipl相比,它的尺寸太大了.

操作系统是freebsd 9.0.

祝商祺!

fal*_*lse 5

在ps/top-listing中有两个数字:分配的虚拟内存(大小)和实际使用的物理内存(res).从这看起来GNU Prolog最初使用的内存比SWI少.即:GNU为2196K,SWI为3728K.

但是你无法单独从这些数字中得出任何相关的东西.你唯一可以说的是带有顶层的默认环境需要很多内存来启动 - 只要你没有用其他程序"分页"进程......

两个系统都试图将内存消耗降低,但是在不同的级别上:

GNU Prolog提供了对跳过未使用的内置谓词的独立可执行文件的编译.可执行代码的处理方式与C类似:因此它只读映射到物理内存中.如果您运行此类可执行文件的多个实例,则它们将共享可执行文件的相同物理内存.

在缺点方面,GNU Prolog缺乏垃圾收集.堆(copystack)和原子(symboltable)都有.为避免溢出处理,内存区域被大量分配.但这只是对虚拟内存的预留.据我所知,目前所有的Unix变种都过度提交了虚拟内存,所以这并没有带走相应的交换空间.

另一方面,SWI-Prolog在可写内存中分配其Prolog代码.此外,在GC期间"触摸"(标记/未标记)存储器.因此,Prolog程序不能在不同的SWI实例之间共享,甚至不能像mergemem那样动态重新共享.也就是说,mergemem(或类似的)可以页面共享它,但是在下一个db-GC上,它是copy-on-write unshared.请参阅链接共享如何减少SICStus的内存消耗.但是,SWI拥有多线程支持,这有点诱导共享.

SWI拥有最好和最完整的堆和原子垃圾收集器之一.

所以,你的里程可能会有所不同 毫无疑问,最好的是将两者的优势结合在一起的系统.