2

これは初心者の質問のように聞こえるかもしれませんが、ここに行きます。基本的に、私はあるオブジェクトから別のオブジェクトに大量のデータを渡します。以下は簡単な例です。

//例1
関数Person(hugeData){
    this.info = function(){
        console.log(hugeData);
    }
}
Homer = new Person(hugeData);
Homer.info();

と比べて

//例2
関数Person(){
    varhugeData;

    this.set = function(data){
        巨大なデータ=データ;
    }

    this.info = function(){
        console.log(hugeData);
    }
}
ホーマー=新しい人();
Homer.set(hugeData);
Homer.info();

2つのコードスニペットの間にパフォーマンスの面で多くの違いがありますか?コード自体ではなく、例のコンテキストに焦点を当ててください(オブジェクト変数の設定と引数の受け渡し)。

上記の例はJavascriptの場合ですが、同じ原則がPHPなどの他のプログラミング言語にも当てはまるかどうかも知りたいと思います。

ありがとう。

4

4 に答える 4

4

No, not at all.

Without going into much detail now, both, formal paramters and local variables are stored within the such called Activation Object (in ES3) or the Lexical Environment Record (ES5) under the hood.

So access times should be identical by spec.


If you want to know the details, checkout:

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

and

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-2-lexical-environments-ecmascript-implementation/


Testcase: http://jsperf.com/formal-parameters-vs-local-variables-access-time

于 2012-09-14T08:30:59.537 に答える
2

あなたの質問の主なポイントは、この行が...

hugeData = data;

...コード内でパフォーマンスに影響を与える可能性があります。

答えはノーです。そうではありません (少なくとも、アプリケーションのパフォーマンスに影響を与える可能性はありません)。

オブジェクトhugeDataを参照する場合 (JS の配列は基本的にオブジェクトであることを思い出してください)、実際にはこのオブジェクトへの参照のみを格納します。そして参照は、オブジェクトの内容を複製することなく、コピーされるものです。

hugeData文字列を参照する場合、もう少し複雑になる可能性があります...しかし、私の知る限り、ほとんどの最新のブラウザー (例としてMDNを確認してください) は現在、「コピーオンライティング」手法を実装しています。つまり、文字列はここでも複製されません。

于 2012-09-14T08:38:52.733 に答える
0

変数で渡すのが一番です。巨大なデータがプリミティブではないことは明らかなので、関数のコンテキストでのみ参照します。jAndyの答えを見てください。

于 2012-09-14T08:33:03.990 に答える
0

この場合、Javascript の実装はそれぞれ異なるため、一般化することは困難です。

オブジェクトの作成で大量のデータを渡すと、メモリの再割り当てが節約されると想像できます。これは、最初にほとんどデータのないオブジェクトを作成し、後で大量のデータを追加する場合に発生します。しかし、ほとんどの JS 実装ではビッグ データ チャンクがいずれにせよ参照に格納されるため、実際に問題になることはほとんどありません。

于 2012-09-14T08:35:08.627 に答える