代码之家  ›  专栏  ›  技术社区  ›  selfawaresoup

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

  •  6
  • selfawaresoup  · 技术社区  · 16 年前

    我一直在想,在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 ,但原型变体使用的内存并没有减少多少(大约26 MB用于 TestObjectThin )

    我还检查了 测试对象精简 实例在其“文本”属性中包含相同的字符串,因此它们实际上正在使用原型的属性。

    现在,我不知道该怎么想。原型设计似乎一点也不节省内存。

    我知道,基于许多其他原因,原型设计是一个很好的主意,但我特别关注这里的内存使用。为什么原型变体使用几乎相同的内存量?我遗漏了什么吗?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Yann Ramin    16 年前

    您的测试是可疑的-在分配javascript对象时有很大的开销,这可能会扭曲您的结果。如果您在原型类中插入大量数据,它可能会显示出更大的增益。

    不幸的是,在javascript中很难控制内存使用,特别是当涉及jit时(您的jited方法在内存使用模型中表示吗?等)。

        2
  •  1
  •   Alsciende    16 年前

    在这两种情况下,都创建了1000个对象,并且对象的内存比字符串重得多。瘦与胖代表了999弦的增益。所以假设创建一个对象(即使是一个简单的对象)需要花费26K,创建一个1000个字符宽的字符串需要花费4K,那么您的观察就得到了完美的解释。

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