【解決方法】長い配列をループする最速の方法は何ですか


121 項目の配列をループする最速の方法は何ですか?
私は疑問に思っていました(あなたが試したことにスキップしてください)

私が試したこと:

forEach() 関数を使用してループしようとしましたが、ゲームの速度が 10 ~ 25 fps に低下します
そのため、高速ループの推奨事項が必要です

解決策 3

「foreach」は、コレクション全体で列挙子オブジェクトを維持する必要があるため、単純な「for」インデクサーよりも低速です。 コレクションのナビゲーション関数を呼び出すと、コレクション内のアイテム数を掛けたオーバーヘッドが発生します。

単純な「for」ループは、値/オブジェクトの配列への単なるインデクサーです。 基本的に、for ループはポインターを配列にインクリメントするだけで、オーバーヘッドはほとんどありません。

for ループを高速化するには、複数のスレッドが必要で、それぞれが配列全体の小さなセグメントで動作しますが、スレッド自体を設定および管理すると、その価値よりも多くのオーバーヘッドが追加される可能性があります。

すでに指摘されているように、問題は配列を反復処理する速度ではありません。 物事を遅くするのは、配列内の各要素に対して行っていることです。

解決策 1

1 つの方法 (ただし注意が必要) は、並列関数を使用することです。以下を参照してください。 非同期 JavaScript 関数を順次または並列に実行する方法[^]

このようにして、配列の「チャンク」のみを処理するいくつかの関数を使用できます。

以下も参照してください。 javascript-ec834a0f21b9 でどのタイプのループが最速か[^]

解決策 2

見積もり:

長い配列をループする最速の方法は何ですか

まず第一に、121 のリストは長くはありません。通常、長いのは 100,000 の後で始まります。
ループの種類 (for、while …) が何であれ、それ自体は高速です。
ループを遅くするのは、ループ内で何をするかです。

問題は、あなたが興味のあることを何も言わなかったことです。ゲームが何であるか、またはループをどのように実行したかについてはわかりません.

マルチスレッドについて考える前に、最適化について考える必要があります。
プログラムの最適化 – ウィキペディア[^]

解決策 4

上記の応答を考えてみてください。これは、最終的にコードの最適化につながるものです。

処理を高速化するためにできることがいくつかあります (コードがないため、これらは一般的なものです)。

0 – ループ外のループ内で変更されていない計算と値の設定を実行します。 定数を同じ値に繰り返し設定する必要はありません。
1 – 限られたセット (2 の累乗など) から計算値を計算している場合は、計算の代わりにルックアップ テーブルを使用します。事前に計算された値のテーブルへのインデックスを使用できる場合は、次のことができます。潜在的に膨大な数の計算を節約することにより、処理を高速化します。項目 0 も参照してください。
2 – ループに内部のネストされたループがある場合は、一連の計算に「展開」できるかどうかを確認してください。 これは、内側のループの要素数が固定されている場合に最も適しています。
3 – 内部関数がある場合、それらが非常に単純な場合は、代わりにコードをプラグインするだけです。 関数を呼び出して戻ることは、多くのオーバーヘッドです。

これらはほんの一部であり、すべてが常に当てはまるわけではありません。 良い判断をしてください。

解決策 5

配列が生涯一定であることが意図されている場合は、すでに計算された値を再利用できます。

配列が揮発性であるが、一部の要素がプログラムの存続期間中に複数回見つかる場合でも、値ベースのキャッシュを実行できます。 たった 120 個のアイテムに対して 15 FPS と言っているからです。 これは、アイテムあたり 0.55 ミリ秒を意味します。 これは、メモリ/キャッシュから直接結果を取得するよりもはるかに遅くなります。

では、データセット (可能なすべての値の数) の大きさと、コンピューターの RAM のサイズ (またはデータセットが十分に小さい場合は L1 キャッシュ) はどれくらいですか?

コメント

タイトルとURLをコピーしました