3

だから私はプログラミングの概念を教えるためにC+を使用するコンピュータサイエンスコースを受講しています。今日、私はJSに適用できるかどうかわからないという新しい概念を学びました。この概念では、string.lengthが計算されるたびにシステムリソースが消費されます。小さな問題のように思えますが、巨大なアレイとそれがどのように加算されるかについて考えさせられました。この例をチェックして、ループ#2が最初のループよりも実際に効率的であるかどうかを知らせてください。

var weekDay = ["Monday", "Tuesday", "Wednesday"];

//for loop #1
for(i=0; i<weekDay.length; i++){
 //code code code
;}

//for loop #2
for(i=0; var n=weekDay.length; i<n; i++){
 //code code code
;}
4

4 に答える 4

5

2番目のアプローチは高速ですが、それほどではありません。また、小さな構文エラーがあります

for( var i = 0, n = weekDay.length; i < n; i++ ){ ... }

これは、JavaScriptコードではかなり一般的です。var間違ったスコープを踏まないように、すべての変数をで宣言することの重要性に注意してください。

このjsパフォーマンステストはhttp://jsperf.com/forloopiteratorで確認できます。これは、2番目のアプローチを使用した場合に結果が24%高速であることを示しています。

于 2013-01-09T10:29:03.787 に答える
2

まず第一に、時期尚早の最適化はすべての悪の根源です

第二に、ループ#2の方が効率的であるというのは完全に正しいです。

ループ#1は、ループの反復weekDayごとの長さを計算します。これは、10,000の長さの配列で10,000回の長さを計算することを意味します。

ループ#2はweekDay、変数の長さを計算しnて結果になるように設定するため、反復ごとに長さを再計算するのではなく、変数に長さを保持します。

時期尚早の最適化が悪い理由についてもっと読む

于 2013-01-09T10:34:54.860 に答える
0

この質問は何度か聞かれました... JavaScriptforループを最適化することは本当に必要ですか?

次のリンクはとても役に立ちました。基本的にはブラウザのバージョンとベンダーによって異なります。

場合によっては、たとえばIEはい#2の方がはるかに高速です

http://jsperf.com/loop-iteration-length-comparison-variations

于 2013-01-09T10:32:45.577 に答える
0

私は常に長さを明示的に事前にキャッシュします。

var n = weekDay.length;
var i;
for(i=0;i<n; i++){ 
do_something;
}

とにかくすべての変数定義が関数の先頭に「持ち上げられる」ので、はるかに明確なアプローチ。

于 2013-01-10T00:05:50.560 に答える