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

Differences between functions and objects, and how it affects performance

本文关键字:何影响 性能 影响 之间 对象 函数      更新时间:2023-09-26

谁能阐明为什么下面显示的两个示例之间的内存占用似乎存在如此大的差异?我正在使用节点.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));

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

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

例如,给定:

   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() {}

(解析可以被视为一次性成本。

在后面的示例中,将分配每个属性,并创建每个函数作为对象文本计算的一部分。

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

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

基本上,而不是做:

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

你可以做:

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