首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >减少了大量Duktape上下文的内存选项

减少了大量Duktape上下文的内存选项
EN

Stack Overflow用户
提问于 2015-07-21 02:08:26
回答 2查看 399关注 0票数 0

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

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

注意:是的,我知道DukTape1.7.0不是真正的全功能,但它是为了我正在尝试做的事情,并且没有我不想要的,也不需要从后来的引擎,V8等中获得的JIT复杂性。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-21 23:44:23

新的全局环境的最小启动成本几乎完全是由内置对象及其属性造成的:大约有70个内置对象,250个函数属性和90个值属性。您可以通过删除不必要的内置和/或内置属性来减少此问题。

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

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

使用这些措施中的任何一个都不可能达到4kB/context--有太多的内置对象和属性可以做到这一点。只有当您为多个脚本共享全局对象时,才有可能达到每个上下文的内存量,这取决于脚本的隔离和线程需求,也可能不可能。

票数 1
EN

Stack Overflow用户

发布于 2016-01-30 20:14:07

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31523398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档