函数和对象之间的差异,以及它如何影响性能

时间:2013-11-03 18:12:54

标签: javascript node.js v8

有没有人可以解释为什么下面显示的两个例子之间的内存占用似乎有如此大的差异?我正在使用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));

2 个答案:

答案 0 :(得分: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() {}

(解析可以被视为一次性费用。)

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

答案 1 :(得分:1)

在第一个示例中,只有在调用 parent 函数时才会懒惰地创建函数,但在第二个示例中,所有成员都被初始化为对象文字的一部分。

如果您正在尝试减少内存占用,您应该使用原型链,这样您就可以在多个实例之间共享功能。

基本上,而不是做:

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

你可以这样做:

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

function test() {
    var testvar = Object.create(base);
}