-6

検討

a = ['1','2','3','4','5']
for(var i = 0; i < a.length; i++) { if (a[i] == 3) console.log('found it!') }

a = {'1': true, '2': true, '3': true, '4': true}
a['3']

どちらが速くなり、なぜですか?

4

6 に答える 6

5

ランダムな要素を見つけようとするとき、特に多数のアイテムを検索しているときに、オブジェクトの検索は平均してはるかに高速になります。これは、これを行うための基本的なアルゴリズムがB ツリー検索であり、時間の複雑さが O(log n) であり、オブジェクトの各要素に対してチェックする必要なく、アイテムのメンバーシップをすばやく検索できるためです。

これは、配列を検索するときに、O(n) の線形時間複雑度を持つ配列に含まれていないかどうかを判断する前に、各要素をチェックする必要があるのとは対照的です。

オブジェクト検索が高速であることを示すベンチマークは次のとおりです: http://jsperf.com/array-vs-objv2/6

于 2012-06-11T22:12:47.707 に答える
2

jsPerf http://jsperf.com/array-vs-objv2でパフォーマンスを比較する前に、両方のコードを同等にするために、以下のようにコードを変更しました。

テスト1:

テスト設定:

var a = [];
var b = {};

for (var i = 1; i <= 100000; i++) {
   a.push(i);
   b[''+i] = true;
}

配列の使用:

for(var i = 0; i < a.length; i++) { 
  if (a[i] === 99999) {
     console.log(true);
     return;
  }
}

オブジェクトの使用:(高速)

console.log(b['99999']);

テスト2:

配列の使用:(高速)

a = ['1','2','3','4','5']
for(var i = 0; i < a.length; i++) { 
  if (a[i] === 3) {
     console.log(true);
     return;
  }
}

オブジェクトの使用:

a = {'1': true, '2': true, '3': true, '4': true, '5': true};
console.log(a['3']);

Resut :( Trevorが指摘したように)配列検索は、アイテムが少ないほど高速になりますが、大きなリストを検索すると、線形検索のために配列が遅くなります。

于 2012-06-11T22:04:01.613 に答える
2

JavaScript のすべてのブラック マジックの仕組みを知らなくても、a['3']線形検索を使用しないようなものと言えます。

JavaScript はその要素を直接参照しているので、検索を行う必要さえありませんか? 多分。もしそうならa['3']、少し多くのメモリを消費するかもしれませんが、それを使用して線形検索よりも高速に検索します。(これが実際に行っていることだと思います。)

そうでない場合は、実際にデータ構造を検索しますが、ほとんどの場合、単純な線形検索は使用しません。おそらく内部の仕組み、またはある種の二分木検索、またはその他の混乱があります。

于 2012-06-11T22:16:19.820 に答える
1

連想配列はより高速に実行され、必要な論理操作は 1 つだけです。ただし、これを実現するには、キーを値にリンクするためにメモリにさらに保存する必要があります。これは、ハッシュ テーブル対配列引数とほぼ同等です。

欠点は、挿入が遅く、メモリ使用量が多いことです。ルックアップの速度はエンジンによって異なります。

https://developers.google.com/v8/design

セットアップと検索の両方の完全な分析: http://jsperf.com/array-vs-objv2/5

于 2012-06-11T22:12:02.207 に答える
1

このベンチマークの数値を確認してください

オブジェクトプロパティと配列アイテムのアクセス時間が近い

最初のケースでは、配列項目へのアクセスが 3 回あります

2番目のケースでは、オブジェクトプロパティへのアクセスは1回だけです

だから私は2番目のものはより速いはずだと思う

于 2012-06-11T22:13:39.437 に答える
0
a = {'1': true, '2': true, '3': true, '4': true}
if (a['3'] === true) {
  console.log("found it");
}

ほとんどの場合、より高速になります。

a = ['1','2','3','4','5']
for(var i = 0; i < a.length; i++) { 
  if (a[i] == 3) {
    console.log('found it!')
  }
}

2つ目は、配列のすべての値をループする必要がある場合があるためです。

于 2012-06-11T22:01:09.527 に答える