Javascript函数对象有多大?

Kev*_*ang 7 javascript performance

我只是想知道函数对象的开销是多少.在一个面向对象的设计模型,你可以酿出了很多每个都有自己的私有函数的对象,但在你有超过10,000个,这些私有函数对象的情况下,我认为,可以使一个很大的开销.我想知道是否有足够的情况将这些函数移动到实用程序类或外部管理器以保存这些函数对象占用的内存.

use*_*621 7

这是Chrome处理功能的方式,其他引擎可能会执行不同的操作.

我们来看看这段代码:

var funcs = [];
for (var i = 0; i < 1000; i++) {
    funcs.push(function f() {
        return 1;
    });
}
for (var i = 0; i < 1000; i++) {
    funcs[0]();
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/7LS6B/4/

现在,引擎创建了1000个功能.

单个函数本身几乎不占用任何内存(在这种情况下为36个字节),因为它只保存一个指向所谓的SharedFunctionInfo对象的指针,该对象基本上是对源代码*中函数定义的引用.这称为延迟解析.

只有在经常运行它时,JIT才会启动,并创建函数的编译版本,这需要更多内存.所以,最后funcs[0]需要256个字节:

堆分析器截图

*)这不完全正确,它还包含范围信息,函数名称和其他元数据,这就是为什么在这种情况下它的大小为592字节.

  • 功能标识的36个字节(64位节点下的72个)实际上很多,实际上是交易破坏者.它是普通对象开销的3倍(12位字节或64位24字节).假设node64,如果你创建200个对象,每个对象有25个方法,每秒有20个请求,你每秒创建大约7兆字节的文字垃圾,给GC带来了疯狂的压力,浪费了很多服务器潜力.当然,在客户端,如果您制作游戏或丰富的GUI应用程序,您将从停顿中获得可怕的用户体验. (3认同)