0

谁能解释一下为什么下面显示的两个示例之间的内存占用量似乎存在如此大的差异?我使用 node.js 作为环境。

它们都产生相同的结果和映射

var util = require('util');

var startMem = process.memoryUsage().heapUsed;

/*
var test = function() {

    var testvar = function() {
        this.innerTest1 = function() {
            this.someVal1 = "this is a test";
            this.someFunc1 = function() {
                return "this is another test";
            }
        }
        this.innerTest2 = function() {
            this.someVal2 = "this is a third test";
            this.someFunc2 = function() {
                return "this is a forth test";
            }
        }
    }
}
*/
//out:
//mem: 448088


var test = function() {
    var testvar = {
        innerTest1 : {
            someVal1 : "this is a test",
            someFunc1 : function() {
                return "this is another test"
            }
        },
        innerTest2 : {
            someVal2 : "this is a third test",
            someFunc2 : function() {
                return "this is a forth test"
            }
        }
    }
}

for (var i = 0; i < 50000; i++) {
    var testobj = new test();
}

//out:
//mem: 1060040


console.log("mem: " + (process.memoryUsage().heapUsed - startMem));
4

2 回答 2

1

在第一个示例中,只有在调用其父函数时才延迟创建函数,但在第二个示例中,所有成员都被初始化为对象字面量的一部分。

如果你想减少你的内存占用,你应该使用原型链,它允许你在多个实例之间共享函数。

基本上,而不是这样做:

function test() {
    var testvar = {
        someFn: function () {}
    };
}

你可以做:

var base = {
    someFn: function () {}
};

function test() {
    var testvar = Object.create(base);
}
于 2013-11-03T18:30:42.377 回答
1

这两个代码片段具有完全不同的行为。

在第一个示例中,在调用包含函数之前,不会设置或创建属性/函数。但是,从不调用包含函数。

例如,给定:

   this.innerTest1 = function() {
        // the property is NOT SET until this function is run
        this.someVal1 = "this is a test";
        // this function is NOT CREATED until this function is run
        this.someFunc1 = function() {
            return "this is another test";
        }
    }

同样,这同样适用于分配给innerTest1。因此,第一个示例代码等效于以下代码,但不是很有用。

var testvar = function() {}

(解析可以被认为是一次性成本。)

在后面的示例中,每个属性都被分配,每个函数都是作为对象字面量评估的一部分创建的。

于 2013-11-03T18:16:42.990 回答