0

以下に示す 2 つの例の間でメモリ フットプリントに大きな違いがあるように見える理由について、誰かが光を当てることができますか? 環境として 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

2 つのコード スニペットの動作はまったく異なります。

最初の例では、含まれている関数が呼び出されるまで、プロパティ/関数は設定または作成されません。ただし、含まれている関数が呼び出されることはありません。

たとえば、次のようになります。

   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 回限りのコストと見なすことができます。)

後の例では、すべてのプロパティが割り当てられ、すべての関数がオブジェクト リテラル評価の一部として作成されます。

于 2013-11-03T18:16:42.990 に答える