2015-09-29 10 views
6

JavaScriptの配列.lengthの時間の複雑さは何ですか?私はプロパティがすべての配列に自動的に設定されているように見えるので、それは一定であると思います。javascriptの長さの複雑さ.length

+1

私は可能性がある場合は、なぜ懸念のオブジェクトプロパティの時間複雑性はありますか?そう、最小限のようですか? –

答えて

7

これはプロパティが自動的にすべての配列に設定されているように見えるので、あなたはそれを探しているだけなのでしょうか?

右。 おそらく。それは格納されている(計算されていない)プロパティで、必要に応じて自動的に更新されます。

言わせていただいたように、は、JavaScriptエンジンは、仕様書に記載されているものとの乖離を見ることができなければ、カバーの下で好きなことを自由に行うことができます。仕様が時間の複雑さについて何も言わないからlength ...

JavaScriptの標準配列は理論的にはちょうどobjects with special behaviorであることに注意してください。理論的にはのJavaScriptオブジェクトはプロパティバッグです。プロパティバッグのプロパティを調べることは、オブジェクトがある種の名前 - >値ハッシュマップとして実装されている場合、理論上、他にいくつのプロパティが存在するかによって決まります(そして、以前は悪い昔)。現代のエンジンはオブジェクトを最適化します(ChromeのV8はダイナミックなクラスを作成してコンパイルすることは有名ですが)。そのオブジェクトに対する操作はプロパティの検索パフォーマンスを変更する可能性があります。プロパティを追加すると、V8でサブクラスを作成することができます。プロパティ(実際にはdeleteを使用)を削除すると、V8が手を捨てて「辞書モード」に戻り、オブジェクトへのプロパティアクセスが大幅に低下します。

言い換えれば、それは、エンジンとエンジンとの間で変化することがあります。しかし、配列を純粋に配列として使用する場合(配列以外のプロパティを格納しない場合)、定時検索が可能です。

1

ボトルネックのようには思えませんが、確かに使用したい場合はvar len = arr.lengthをチェックしてください。私のマシンでは、大きな違いはありませんが、傷つくことはなく、少し速いと思われます。

var arr = []; 
 
for (var i = 0; i < 1000000; i++) { 
 
    arr[i] = Math.random(); 
 
} 
 

 

 
var start = new Date(); 
 
for (var i = 0; i < arr.length; i++) { 
 
    arr[i] = Math.random(); 
 
} 
 

 
var time1 = new Date() - start; 
 
var start = new Date(); 
 

 
for (var i = 0, len = arr.length; i < len; i++) { 
 
    arr[i] = Math.random(); 
 
} 
 

 
var time2 = new Date() - start; 
 

 
document.getElementById("output").innerHTML = ".length: " + time1 + "<br/>\nvar len: " + time2;
<div id="output"></div>