2011-05-27 3 views
9

私は多くの人々が引数オブジェクトへのアクセスが高価だと言っていると聞いてきました。 (例:Why was the arguments.callee.caller property deprecated in JavaScript?引数オブジェクトにアクセスするのは高価です。

Btwこの文はまったく何を意味しますか?単に引数のオブジェクトにアクセスしていない単純なプロパティの参照ですか?大したことはなんですか?

答えて

13

...もっと親密JS通訳を知っている人に確認に行く

:引数へのアクセス)

1オブジェクトは、オブジェクトの引数を作成する必要があります。特に、現代のJSエンジンは、関数を呼び出すたびに引数の新しいオブジェクトを実際に作成しません。引数をスタックに渡すか、またはマシンレジスタに渡します。ただし、argumentsに触れると、実際のオブジェクトを作成する必要があります。これは必ずしも安いわけではありません。あなたは引数がJSエンジンがそうでなければ(例えば、あなたが引数に割り当てることはありませんした例を検出し、その一般的なケースを最適化し実行することができ、さまざまな最適化をオブジェクトに触れたら

2))窓の外を行きます。 argumentsによって引数を混乱させるかもしれないという事実にエンジンが対処しなければならないので、関数の引数へのアクセスはすべて、argumentsを経由するものだけでなく、はるかに遅くなります。

+0

良い説明 - 私はそれがそれのようなものだと思った。 –

+0

うわー、私は本当にこの素晴らしい答えに感心しています。 JSエンジンで作業しましたか? @Boris Zbarsky。 –

+0

gets arguments.lengthのような読み込み専用のものを実行すると、オーバーヘッドは単純に新しいargumentsオブジェクトを作成するだけで、さまざまな最適化には影響しません。 – Pacerier

0

私はまた、引数オブジェクトへのアクセスが高価な理由について深刻な説明を聞いたこともありません。しかし、このサイト:http://www.playmycode.com/blog/2011/03/simple-yet-effective-javascript-optimisations/では、引数は実際には配列ではなく、配列にアクセスするより効率が悪いことに注意してください。上記のリンクされたサイトは、引数を最適化として配列に変換することを示唆しています。大したことは、少なくとも二つある

+0

ES5では、* arguments *は、明確に定義されたプロパティ(ES5§10.6)を持つArgumentsオブジェクトです。 – RobG

関連する問題