原型继承应该可以节省内存,对吧?

时间:2010-04-21 07:51:20

标签: javascript inheritance prototype memory-management

我一直想知道在JavaScript中使用原型是否应该比直接将对象的每个成员直接附加到它上更有内存效率,原因如下:

  • 原型只是一个对象。
  • 实例仅包含对其原型的引用。

对战:

  • 每个实例都包含构造函数定义的所有成员和方法的副本。

我开始了一个小实验:

var TestObjectFat = function()
    {
        this.number = 42;
        this.text = randomString(1000);
    }

var TestObjectThin = function()
    {
        this.number = 42;
    }
TestObjectThin.prototype.text = randomString(1000);

randomString(x)只生成一个长度为x的随机字符串。

然后我像这样大量地实例化对象:

var arr = new Array();
for (var i = 0; i < 1000; i++) {
    arr.push(new TestObjectFat()); // or new TestObjectThin()
}

并检查浏览器进程(Google Chrome)的内存使用情况。我知道,那不是很准确......

但是,在这两种情况下,内存使用量都按预期显着增加(TestObjectFat约为30 MB),但原型变体使用的内存不多(TestObjectThin约为26 MB)。< / p>

我还检查了TestObjectThin实例在其“text”属性中包含相同的字符串,因此它们实际上正在使用原型的属性。

现在,我不太清楚该怎么想。原型设计似乎根本不是最大的内存保护程序。

我知道由于许多其他原因,原型设计是个好主意,但我特别关注这里的内存使用情况。原型变体使用几乎相同数量的内存的任何解释?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您的测试是可疑的 - 分配JavaScript对象会产生很大的开销,这可能会影响您的结果。如果将大量数据插入到原型类中,则可能会显示更大的增益。

不幸的是,在JavaScript中很难控制内存使用,特别是涉及JIT时(你的JITed方法是在内存使用模型中表示的吗?等等)。

答案 1 :(得分:1)

在这两种情况下,您创建了1000个对象,并且内存中的对象比字符串重得多。 Thin vs Fat表示增益为999个字符串。因此,假设创建一个对象(即使是一个简单的对象)需要花费26k,而创建1000个字符宽的字符串需要花费4k。然后你的观察就完美地解释了。

Fat = 1000 * 26Ko + 1000 * 4Ko = 30Mo
Thin = 1000 * 26Ko + 4Ko = 26Mo