18

これは私にとって大きな驚きでした。この結果を理解したいと思います。基本的に文字列(チェックしたいURLの一部)を取得し、4つの項目(実際には文字列に存在する)の存在をチェックすることになっているjsperfでテストを行いました。

5つの方法でチェックします。

  1. プレーンindexOf;
  2. 文字列を分割してから、indexOf;
  3. 正規表現検索;
  4. 正規表現の一致;
  5. 文字列を分割し、アイテムの配列をループして、それらのいずれかが一致するはずのものと一致するかどうかを確認します

驚いたことに、5番はChrome21で最速です。これは私が説明できないことです。

Firefox 14では、プレーンなindexOfが最速で、私が信じることができます。

4

2 に答える 2

9

私も驚いていますが、Chromeはv8を使用しています。これは、あらゆる種類のトリックを引き出す高度に最適化されたJavaScriptエンジンです。そして、Googleのスタッフは、実装のパフォーマンスをテストするために実行するJavaScriptの最大のセットをおそらく持っています。だから私の推測はこれが起こるということです:

  1. コンパイラは、配列が文字列配列であることを認識します(型はコンパイル時に決定でき、実行時チェックは必要ありません)。
  2. ループでは、を使用するため===、文字列を比較するための組み込みのCPUオペコード(repe cmpsb)を使用できます。したがって、関数は呼び出されません(他のテストケースとは異なります)
  3. 最初のループの後、重要なもの(配列、比較する文字列)はすべてCPUキャッシュにあります。地域はそれらすべてを支配します。

他のすべてのアプローチは関数を呼び出す必要があり、局所性は解析ツリーを構築するため、正規表現バージョンでは問題になる可能性があります。

于 2012-08-02T10:30:50.120 に答える
3

さらに2つのテストを追加しました:http://jsperf.com/finding-components-of-a-url/2

単一の正規表現が(Chromeで)最速になりました。また、regExpリテラルは、RegExpに変換された文字列リテラルよりも高速です。

于 2012-08-02T09:59:40.697 に答える