-1

JavaScript で連想配列要素の大きな配列 (22,000 要素) を構築しようとしています。メモリ使用量に関してインデックスの長さを気にする必要はありますか?

つまり、次のオプションのどれがメモリを節約しますか? それともメモリ消費量は同じですか?

オプション1:

  var student = new Array(); 
  for (i=0; i<22000; i++)
   student[i] = {
   "studentName": token[0],
   "studentMarks": token[1],
   "studentDOB": token[2]
   };

オプション 2:

  var student = new Array(); 
  for (i=0; i<22000; i++)
   student[i] = {
   "n": token[0],
   "m": token[1],
   "d": token[2]
   };

Google Chrome DevTools でこれをテストしようとしましたが、決定を下すには数値に一貫性がありません。私の最善の推測は、配列インデックスが繰り返されるため、ブラウザは各学生に対して繰り返さないようにすることでメモリ使用量を最適化できるということです[i]が、それは単なる推測です。

編集: 明確にするために、問題は次のとおりです。多くの小さな連想配列を含む大きな配列。メモリ要件に関しては、長いインデックスまたは短いインデックスを使用することは重要ですか。

編集 2: コメントで提案され、@Joseph Myers が参照している 3N 配列アプローチは、サイズが 3*22000 の 1 つの配列 'var student = []' を作成し、名前、student に student[0] を使用することです[1] はマーク、学生 [2] は DOB など。

ありがとう。

4

2 に答える 2

3

違いはわずかなので、答えはノーです。この種のことは、ほとんどマイクロ最適化にも該当しません。このようなジレンマに陥ったときは、常に最も読みやすい解決策を選択する必要があります。2 番目のオプションのコードを維持するコストは、それによって得られるパフォーマンスの向上 (もしあれば) を上回ります。

ただし、配列を作成するためにリテラルを使用する必要があります。

[]の代わりにnew Array()。(ただの補足)

問題を解決するためのより良いアプローチは、おそらくデータを部分的にロードする方法を見つけて、ある種のページネーションを実装することです (クライアントで重い計算を行っていないと思います)。

于 2013-06-26T03:15:22.227 に答える
1

連想配列の計算コストの主な分析は、格納される要素の数が増加するにつれてパフォーマンスが低下することに関係していますが、キーの長さが増加するにつれてパフォーマンスが低下することについては、いくつかの結果が得られています。

Algorithms in C by Sedgewickでは、一部のキーベースのストレージ システムではキーの長さによって検索コストが増加しないこと、および他のシステムでは増加することが指摘されています。すべての比較ベースの検索方法は、キーの長さに依存します。2 つのキーが右端のビットだけが異なる場合、それらを比較するには、それらの長さに比例する時間が必要です。ハッシュベースの方法では、キーの長さに比例する時間が常に必要です (ハッシュ関数を計算するため)。

もちろん、キーは元のコード内および/またはスクリプトの実行中に少なくとも一時的にストレージ スペースを占有します。

JavaScript に使用されるストレージの種類はブラウザーによって異なる場合がありますが、リソースに制約のある環境では、小さいキーを使用すると利点があります。価値があります。

PS 私の図書館には、最新の計算アルゴリズムについて 12 月に注文した 2 冊の新しい本が入ったばかりです。明日それらをチェックして、連想配列/JS オブジェクトのパフォーマンスに影響を与えるキーの長さに関する新しい結果があるかどうかを確認できます。

更新: studentNameNexus 7 では 2% 長く、iPhone 5 では 4% 長くかかるなどのキーは、私には無視できる程度です。各要素に object を含む 30,000 要素の配列の作成を平均 500 回{ a: i, b: 6, c: 'seven' }実行し、 object を使用して 500 回実行しました{ studentName: i, studentMarks: 6, studentDOB: 'seven' }。デスクトップ コンピューターでは、プログラムは依然として非常に高速に実行されるため、プロセッサの頻度や割り込みの数などによってさまざまな結果が生成され、プログラム全体がほぼ瞬時に終了します。数回実行するごとに、大きいキーサイズの方が実際には速くなります (JavaScript タイマーは CPU 時間ではなくクロック時間に基づいているため、テスト環境の他のバリエーションが結果に 2 ~ 4% 以上影響するためです)。ここ: http://dropoff.us/private/1372219707-1-test-small-objects-key-size.html

配列の3Nアプローチ (最初のオブジェクトのコンテンツには array[0]、array[1]、および array[2] を使用し、2 番目のオブジェクトには array[3]、array[4]、および array[5] などを使用) .) は、どのオブジェクト メソッドよりもはるかに高速に動作します。デスクトップでは、スモール オブジェクト メソッドよりも 5 倍速く、ビッグ オブジェクト メソッドよりも 2 ~ 4%速く、Nexus 7 では11 倍高速です。

于 2013-06-26T03:37:48.080 に答える