3

ゼロを使​​用して大きなJavaScript配列を初期化するために、さまざまなメソッドをテストしています。これまでのところ、push(0)を使用した単純なforループは、他のアプローチよりもはるかに優れているようです(http://jsperf.com/initialise-array-with-zerosを参照)が、これの有効性については疑問があります。テスト。

実際には、このような大きな配列を1回だけ作成してキャッシュするため、後で大きな初期化された配列が必要になったときに、単純にスライスすることができます。したがって、最も重要な評価は、多くの試行の平均ではなく、このコードが最初に実行されるのにかかる時間であると思います。

誰かが同意しませんか?または、1ラウンドだけのタイミングをテストする方法/場所を誰かが知っていますか?

編集:非常に多くのゼロを含む配列を割り当てる理由に関するいくつかの誤解に応えて、2つのことを明確にしたいと思います。

  1. スパース性はありません。複数の大きな配列を作成し、それらを計算に使用する必要があります。これらのコピーはフロートで埋められ、フロートが正確にゼロになる可能性はごくわずかです。
  2. すべての計算がアレイ上で順次実行されるわけではありません。プロセスで配列を生成する関数は、参照によって渡される配列の値を上書きする場合に比べて非効率的だと思います(例:gl-matrix.jsを参照)。

したがって、私の解決策は、1つの大きなゼロで埋められた配列を一度作成し、新しい配列が必要になるたびにslice()を取得し、それを操作する関数を参照してそのコピーを渡すことです。スライスは、どのブラウザでも超高速です。

さて、なぜ私がこれをやりたいのかという懸念はまだあるかもしれませんが、私が本当に興味を持っているのは、最初の実行でさまざまな初期化方法のパフォーマンスを評価できるかどうかです。私の状況では確かにこれを一度だけ実行するので、このタイミングにしたいです。

そして、はい、私のjsperfコードはおそらくいくつかの解決策を見逃しています。ですから、私が思いもよらなかったアプローチがあれば、遠慮なく追加してください!ありがとう!

4

3 に答える 3

6

操作を 1 回だけテストするのは非常に複雑です。コンピューターが他に何をしているかによってパフォーマンスが大きく変わるからです。その単一のテストを何度も実行し、各テスト間で同じ条件にリセットする必要があります。jsperf が何度もテストを実行する理由は、適切な平均値を取得して異常を取り除くためです。

これをさまざまなブラウザーでテストして、全体的にどの方法が最適かを確認する必要があります。非常にさまざまな結果が得られることがわかります。

Internet Explorer では、最速の方法は実際にテストした方法ではなく、ゼロを割り当てる単純なループです。

for (var i = 0; i < numzeros; i++) zeros[i] = 0;
于 2012-06-09T18:47:30.410 に答える
-2

「javascript配列をゼロで初期化する」ことになる実用的なタスクはありません。特に大きなものです。そこに 0 が必要な理由を再考する必要があります。これはスパース配列で、デフォルト値として 0 が必要ですか? 次に、アクセス時に条件を追加して、メモリと初期化時間を無駄にする代わりに、取得した値を 0 に設定します。

于 2012-06-09T18:50:50.120 に答える