2016-07-26 3 views
0
function Obj() 
{ 
    this.prop = { a: 1, b: 2 }; 

    this.access(); 
    access(this.prop); 
} 

Obj.prototype.access = function() 
{ 
    // accessing 'this.prop' directly 
} 

function access(property) 
{ 
    // accessing 'this.prop' through local reference 'property' 
} 

どのくらいのパフォーマンスヒットのは、オブジェクト参照を介して間接的にObj.propにアクセスする際に生じる(グローバルaccess()機能に見られるように)VS直接(Obj年代access()法に見られるように)、そしてその理由は?Javascript - 参照を介してオブジェクトにアクセスすると、パフォーマンスが大幅に低下しますか?

+0

あなたの2つのケースに違いはありません。それが 'this'か' foo'かどうか、あなたはまだ 'x.y'をやっています。 – ssube

+0

@ssube私の理解は以下の通りであり、以下のページでさらに説明されています:http://gameprogrammingpatterns.com/data-locality.html - メモリ内の任意の場所のデータへの参照を指します。そのデータに間接的にアクセスすると、ほとんどの場合、ローカルデータと連続していないため、「キャッシュミス」が発生します。その結果、データが取得されるのを待つ間にCPUが停止し、パフォーマンスが低下します。これはJavascriptにも当てはまりますか、それとも最適化が行われていますか? – sookie

+0

@sookie:この種の最適化は、もしあれば、javascriptのコンパイラ/インタプリタによってのみ行われます。しかし、いいえ、中間変数を使用するかどうかにかかわらず、参照のルックアップは常に同じ数になりますので、違いはありません。そして、それらを繰り返すと、キャッシュ(コンパイルされたコードまたはCPU自体のいずれか)がこれを処理します。 – Bergi

答えて

0

本当にありません。

var p = obj.prop 
p.a 

obj.prop.a 

ローカル変数が出て最適化することができ、正確に等価です。関数呼び出し(access(this.prop))の場合、関数がインライン化されるまでパラメータを最適化することはできませんが、それでも差はほとんどありません。

pに複数回アクセスすると、obj.propにアクセスするのではなく、現代のエンジンで最適化されていても差が出る可能性があります。

パフォーマンスの差はごくわずかです。しかし、javascriptはあなたがそうしたマイクロ最適化を行う言語ではありません。標準コードを書くと、エンジンはあなたのためにそれを最適化します。

関連する問題