12

約 100 000 の要素 (プロパティ) を含む配列 (またはオブジェクト) を操作すると、ブラウザーで indexOf やスライスなどを使用して頻繁にアクセスすると、パフォーマンスやメモリの問題が発生する可能性があるのではないかと思います。最新のブラウザーで大きな配列を操作するための推奨事項はありますか?

私の特定のケース。私は次の構造を持っています:

tack01: [平均10000個の要素の配列] ... tack0n: [平均10000個の要素の配列]

トラックの平均量は 10 です。

要素は {id: "xa432fds", some properties} のようになります

ランタイム中に、ID を提供することを知っている要素にアクセスする必要があります。

変換せずにこの構造を使用する場合、すべてのトラックを検索し、indexOf を使用して ID を持つ要素を見つける必要があります。

したがって、次の構造を持つインデックス オブジェクトを作成することにしました: indexObj = {id1: id1 の要素への参照、id2: id2 の要素への参照}

特定の要素にアクセスするには、indexObj[id] にアクセスするだけでよいのですが、これは私の場合の正しい解決策ですか?

これはすべてクライアント側で実行する必要があります。

4

1 に答える 1

26

それは非常に広い質問です。

主な推奨事項は、自分が何を扱っているかを本当に深く理解することだと思います。JavaScriptの配列は実際にはまったく配列ではなく、JavaScript の通常のオブジェクトのすべての通常の配管を備えたオブジェクトです。配列インデックスは数値ではなく、一部のメモリ テーブルへのオフセットでもありません*。それらは、辞書のようなマップの文字列キーです。配列は単なるオブジェクトであるという事実を受け入れると、データを構造化またはアクセスするための新しい方法が開かれる可能性があり、indexOf.

(* もちろん、JavaScript エンジンの最適化は除きます。エンジン最適化します。)


更新: あなたの編集を見て、はい、データを変換しidて、プロパティ名 ( indexObj[id]) として使用してトラックを検索できるようにすることをお勧めします。次に、 で必要なコストのかかる線形検索の代わりにindexOf、JavaScript エンジンによるプロパティ名の処理の利点が得られます。これは通常、はるかに効率的なルックアップ (b ツリーやハッシュ構造など) になります。

インデックス付きバージョンを作成したら、配列バージョンを解放できれば、配列とそのプロパティ名 ( "0""1"など) によって消費されるメモリを再利用できるようになります。これは役立つ可能性があります (個々のトラックはインデックス付き構造からそれらを参照しているためです)。

于 2012-11-09T14:04:52.620 に答える