13

私はNicholasZackasのHighPerformanceJavascriptを読んでいました。そこでは、forループを逆にして、プロパティルックアップを最小化することでforループを最適化する方法について説明しています。

それ以外の:

for (var i = 0; i < items.length; i++ ) {
  processItems(items[i]);
}

あなたが得る:

for (var i = items.length; i--; ) {
  processItems(items[i]);
}

執筆時点では、実行時間は「元の時間よりも最大50%〜60%高速」でした。それでも私はjsperfを作成し、FirefoxとChromeでは、特にFirefoxでは、最適化されたforループが実際には著しく遅いことに気づきました。

ここに画像の説明を入力してください

新しいブラウザでは、ループの最適化が異なりますか?forループを作成する最も効率的な方法は、今では単純に基本的な方法ですか?

4

1 に答える 1

1

おそらく、ブラウザにブール値への回答をキャストさせるのではなく、テストケースを含めることもできますか?

var i, arr = [...];
for (i = arr.length; i > 0; i -= 1) { arr[i-1] = 1; }

まず、ループは0を終了条件としてキャストします。2番目arr[i]i = arr.length未定義です。これは、Chromeの内部で、暗黙的な型が原因で、Chromeがその配列へのアクセスに関してループを最適化しないことを意味します。

つまり、Chromeに関する限り、Zakasのユースケースで2つの大きな最適化解除が発生しています。

JavaScriptエンジンは、舞台裏で物事を最適化する方法に関して、過去3年間で実際に非常に長い道のりを歩んできました。さて、それはエンジンをだまして最適化をより良くするためのコードを書くことではなく(これは実際の最適化に反直感的である可能性があります-インテリジェンスは現代のブラウザーのJSコンパイラーに組み込まれています)、通常の意味で最適化されたコードを書くことについてもっと-どのデータ型をいつ使用するかなどを知る。

上記のコードサンプルで推奨している2つのことを変更して、テストを再試行すると、数値が正確に一致しない可能性がありますが、それらははるかに近くなることがわかると思います。フォワードパフォーマンス。

于 2013-03-15T18:03:54.957 に答える