まず、2 番目が 1 番目よりもはるかに高速であるべき理由がわかりません。ゼロとの比較と別の数値との比較の違いは、コンパイルされたコードの非常にタイトなループで違いを生む可能性があるものですが、それでもほとんどの場合、カーゴ カルトを選択する可能性があります (そうでない場合は、リチャード フェイマンのカーゴカルト サイエンスを読んでください。参照を取得します。他に何もなければ、それは良い読み物です。プログラミングで、それが役立つと仮定する本当の理由がない場合に、一度うまく機能したものをコピーする同様の傾向が数回以上あります)。
以下が遅くなることがわかりました。
for (i = 0; i < myarray.length; i++) {
// do something with myarray[i]
}
しかし、エンジンが長さチェックを巻き上げる最適化を行った場合、または長さのチェックと変数のチェックがとにかく同等のコストになるように実装されていた場合、遅くないこともわかりました。
また、それまたはあなたが提供する最初のコード例、またはおそらくその両方が、特定のスクリプトエンジンが最適化するものであることがわかります.jsでは非常に一般的なイディオムであり、本質的にループを伴うため、賢明です.スクリプト エンジンで検出して最適化しようとするもの。
しかし、そのような推測を超えて、javascript の下のレベルに到達してエンジンの実装を調べることなく、「一方が他方よりもそのエンジンでうまく機能するため、それが理由である」という以上のことを言うことはできません。あなたの結果は、答えが各エンジンで同じではないことを示唆しています (結局、あなたが期待したものにより多く対応していました)。
さて、いずれの場合も結果は互いに非常に近いことに注意してください。変更によって実際に最適化された、現在かなり人気のあるブラウザーを 1 つまたは 2 つ見つけたとしても、それでも価値がある可能性があります。
それが今まで価値があったのか、それとも単なる仮定だったのかに興味がある場合は、Netscape 2 (結局のところ、これまでで最初の JavaScript ブラウザー) のコピーを入手して、いくつかのコードを実行してアプローチをテストすることができます。その上で。
編集:その種の実験を試みる場合、もう1つは、配列の境界を1つオーバーシュートする意図的にバグのあるループを試すことです。エンジンの可能な最適化の 1 つは、アレイを歩いていることを認識し、範囲外で終了する場所を一度確認することです。もしそうなら、最終的にエラーになると、異なる結果になる可能性があります。