2

私はユーティリティ専用のライブラリに取り組んでいます。文字列、配列、数値、オブジェクトなどの操作に役立つ関数があります。パフォーマンスが主な焦点です。文字列の繰り返し機能 (文字列を何回も繰り返す) に取り組んでいるときにn、現在の方法の速度をテストすることにしました。

Array(n + 1).join(string); // n = times to repeat; string = string to copy

ループを使用する場合と比較されます。これは文字列を繰り返す最短の方法ですが、最も遅い方法でもあります。まだまだ早いのはわかります。つまり、人間が 1 秒間に 200,000 のことを行うことは不可能ですが、ループと比較すると遅いです。

ループが高速な理由は何ですか? 特に高速であることに気付いた 1 つのループは、以下を含む while ループですi--

var i = 10;
while (i--) {
    // do stuff
}

この方法が最速なので、この方法を使用することにしました。しかし、私はなぜ知りたかったのですか?他の方法よりもはるかに高速な理由は何ですか?

これが私のベンチマークです。while ループが for ループより遅い唯一のブラウザーは Opera でした。Internet Explorer 10 では特に高速でした。

4

1 に答える 1

0

あなたの js perf には多くの欠点があります。

  • 1つずれて、10ずれて、9つずれて
  • テストでインライン化されたコード
  • 結果のチェックなし

修正された jsperf では、結果はより理にかなっています。

ここに画像の説明を入力

+= strは最適化されており、StringBuilder. それがあなたの混乱だった場合。Array コードは、新しい配列を割り当て、複雑なセマンティクスを持つ複雑な関数である join を呼び出します。.joinも V8 で最適化されていません。

コードの残りの部分では、実行ごとに異なる方法で常に互いに非常に接近しているため、同じパフォーマンスが得られます。


複製には間違った情報もあります。配列をループしている場合は、CPU キャッシュに対して作業しているため、最良の場合は負であるだけでなく、配列をループしている場合はさらに悪化します。jsperfにも表示されます。

于 2013-08-03T11:57:35.210 に答える