减少了许多Duktape上下文的内存选项

时间:2015-07-20 18:08:26

标签: duktape

我正在尝试配置一个轻量级的全功能JavaScript引擎,这样我就可以同时拥有数万个独立的上下文。每个上下文都做得很少(主要是事件处理,轻字符串操作,自定义计时器等),并且不需要很多堆存储,但需要独立于其他上下文。使用Duktape,如果我在x64中分配20,000个上下文,那么在进行大量处理之前,我会使用1.6GB的内存,或者每个大约80KB。作为另一个数据点,如果我使用SpiderMonkey 1.7.0,20,000运行我大约1.4GB或大约70KB ......几乎相同。我已经玩过Duktape提供的几项优化,但它似乎并没有影响这种用法。

所以问题是,有没有办法让每个上下文的内存利用率降低到每个上下文4KB(或更少)的范围?

注意:是的我知道SpiderMonkey 1.7.0并不是真正的全功能,但这是为了我想要做的事情而且没有我的JIT复杂性不想要,也不需要以后的引擎,V8等。因此,看看Duktape作为替代品。

谢谢!

2 个答案:

答案 0 :(得分:1)

新的全局环境的最低启动成本几乎完全由内置对象及其属性引起:大约70个内置对象具有250个函数属性和90个值属性。您可以通过删除不必要的内置函数和/或内置属性来减少这种情况。

您可以做的一件事是启用DUK_OPT_LIGHTFUNC_BUILTINS,它用更轻量级的函数表示替换大多数内置函数,减少内置对象计数。这有一些副作用,例如内置函数具有可读性较低的自动生成“name”属性。

如果您的上下文很小,您可以做的另一件事是使用“指针压缩”,这会导致Duktape用16位值表示堆指针。您需要提供宏来编码/解码指向此表示的指针。这种方法仅在单个Duktape堆的最大大小为~256kB(假设按4分配)时才有效。该功能是为嵌入式低内存32位平台开发的,因此它可能无法在64位环境中理想地工作(主分支有一些针对指针压缩和64位平台的修复,所以如果你试试这个就使用master)。

使用任何这些措施都无法达到4 kB /上下文 - 内置对象和属性太多了。只有在为多个脚本共享全局对象时才能获得每个上下文的内存量,这可能会也可能不会,这取决于脚本的隔离和线程需求。

答案 1 :(得分:1)

作为这个问题的快速更新:Duktape 1.5.0将有一个配置选项,用于将内置字符串和对象放入ROM(只读数据部分):https://github.com/svaarala/duktape/pull/559。在不使用任何RAM的情况下,所有Duktape堆和上下文将共享相同的只读字符串和对象。一旦完成该功能,它也可以将您自己的字符串和内置函数放入只读数据部分,这样它们就不会消耗每个堆/上下文中的任何RAM。

通过此更改,可以在32位目标上达到~4 kB启动RAM使用率,在64位目标上达到~8 kB。