2014 While
が帰ってきた
論理的に考えてください。
これ見て
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- 少なくとも2つの変数(インデックス、長さ)を作成する必要があります
- インデックスが長さより小さいかどうかを確認する必要があります
- インデックスを増やす必要がある
for
ループは、3つのパラメータを持っています
これがなぜこれより速いのかを教えてください:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- 1つの変数
- チェックなし
- インデックスが減少する(マシンはそれを好む)
while
パラメータは1つだけです
Chrome 28がforループがwhileよりも速いことを示したとき、私は完全に混乱しました。これはある種のことを引き起こしたに違いない
「ええと、誰もがforループを使用しているので、Chrome向けに開発するときはそれに焦点を当てましょう。」
しかし、現在、2014年には、whileループがChromeに戻りました。2倍高速です。他の/古いブラウザでは常に高速でした。
最近、私はいくつかの新しいテストを行いました。現実の世界では、これらの短いコードは何の価値もなく、jsperfは実際にはwhileループを適切に実行できません。
jsperfでwhileループの実際の速度を取得することはできません。
独自のカスタム関数を作成し、それを確認する必要があります window.performance.now()
ええと... whileループが単純に高速になる方法はありません。
本当の問題は、実際にはdom操作/レンダリング時間/描画時間であるか、それともあなたがそれを呼び出したいかです。
たとえば、私は座標と衝突を計算する必要があるキャンバスシーンを持っています...これは10〜200マイクロ秒(ミリ秒ではない)の間で行われます。すべてをレンダリングするのに実際には数ミリ秒かかります。DOMと同じです。
だが
forを使用する別の優れた方法がありloop
ます。たとえば、アレイをコピー/クローンする場合などです。
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
パラメータの設定に注意してください。
- whileループと同じですが、変数を1つだけ使用しています
- インデックスが0より大きいかどうかを確認する必要があります。
- ご覧のとおり、この方法は3番目のパラメーター内で処理を行い、配列内で直接減少するため、誰もが使用する通常のforループとは異なります。
つまり、これは、次のようなマシンが
それを少し短くして無駄なものを削除することを考えていて、同じスタイルを使用してこれを書いたことを書いています:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
それが短くても、i
もう一度使用するとすべてが遅くなるように見えます。前のfor
ループやwhile
1 つよりも1/5遅いです。
注意:;
なしloooのための後に非常に重要です{}
jsperfはスクリプトをテストするための最良の方法ではないと言っただけでも、ここにこの2つのループを追加しました
http://jsperf.com/caching-array-length/40
そして、これはJavaScriptのパフォーマンスに関する別の答えです
https://stackoverflow.com/a/21353032/2450730
この答えは、JavaScriptを作成するパフォーマンスの高い方法を示すことです。したがって、それを読むことができない場合は、質問すると、答えが得られるか、javascript http://www.ecma-international.org/ecma-262/5.1/に関する本が読まれます。