JavaScript での for ループの記述は実行効率にどのような影響を与えますか?

伊谢尔伦
リリース: 2017-07-19 14:40:57
オリジナル
2401 人が閲覧しました

for ループの記述が効率に及ぼす影響

一般に、for ループを記述するには 2 つの方法があります:

  1. 変数を宣言せずに記述する: for(var i = 0;i<arr .length; i++){}for(var i = 0;i<arr.length;i++){}

  2. 写声明变量的写法:for(var i = 0,len = arr.length;i < len;i++){}

除了for循环还有forEach() ,也有文章说forEach()效率最高,推荐用forEach()写法,那么到底哪个效率高呢?做个测试来看看吧。

测试方案

总的测试方案如下:

  1. 做一个容纳4千万的测试数组变量。

  2. 分别用两种写法的for循环和foreach对这个测试变量进行遍历。

  3. 在同一台稳定机器上,进行10次测试,最后取平均值。

  4. 测试环境:CPU:Inter(R) Core i5-3210M,RAM:12GM,system:win10(x64)

测试流程

制作测试变量

先用while循环做个测试变量出来,这个很简单,具体如下:


var testArrs = [],
 i = 0;
while(i<40000000){
 testArrs.push(i);
 i++;
}
ログイン後にコピー

编写相应测试函数

测量和执行时间的代码,我用的是console.time()console.timeEnd()来进行测试。

针对这个三个for循环,先做出三个函数出来,他们分别是

foreach循环测试:


function testForeach(testArrs){
 console.time(&#39;foreach&#39;);
 var newArrs = [];
 testArrs.forEach(function(i){
 newArrs.push(i);
 });
 console.timeEnd(&#39;foreach&#39;);
}
ログイン後にコピー

没有声明变量的for循环:


function testNoDeclare(testArrs){
 console.time(&#39;no declare&#39;);
 var newArrs = [];
 for(var i = 0;i<testArrs.length;i++){
 newArrs.push(i);
 }
 console.timeEnd(&#39;no declare&#39;);
}
ログイン後にコピー

有变量声明的写法


function testUseDeclare(testArrs){
 console.time(&#39;use declare&#39;);
 var newArrs = [];
 for(var i = 0,len = testArrs.length;i<len;i++){
 newArrs.push(i);
 }
 console.timeEnd(&#39;use declare&#39;);
}
ログイン後にコピー

执行测试函数

执行测试函数这里很简单啦,就是调用函数就可以了


testForeach(testArrs);
testNoDeclare(testArrs);
testUseDeclare(testArrs);
ログイン後にコピー

测试结果

经过10次测试,得到了以下结果

foreach不写声明写声明
2372.891ms672.530ms743.974ms
2431.821ms710.275ms805.676ms
2422.448ms729.287ms741.014ms
2330.894ms730.200ms755.390ms
2423.186ms703.255ms769.674ms
2379.167ms689.811ms741.040ms
2372.944ms712.103ms710.524ms
2316.005ms726.518ms726.522ms
2535.289ms733.826ms747.427ms
2560.925ms793.680ms817.098ms
平均值平均值平均值
2414.56ms720.15ms755.83ms

不知道结果有没有让你出乎意料呢?没想到最平常的写法效率最高,为什么?我也没想明白,谁知道就告诉我吧,但我估计写声明的写法是没有意义的。因为len = arr.length这个arr.length

変数の宣言方法を記述します: for(var i = 0,len = arr.length;i < len;i++){}

forループの他にforEach()もあり、forEach()を使うのが最も効率的だという記事もあります。 forEach() の記述メソッドですが、どちらがより効率的でしょうか?テストを行って見てみましょう。

    テスト計画
  1. 全体的なテスト計画は次のとおりです:
  2. 4,000 万を保持するテスト配列変数を作成します。

  3. このテスト変数を走査するには、for ループと foreach の 2 つの記述方法を使用します。

同じ安定したマシンで 10 回のテストを実行し、最後に平均値を取得します。


テスト環境: CPU: Inter(R) Core i5-3210M、RAM: 12GM、システム: win10 (x64)


テストプロセス

テスト変数を作成

まずはしばらく使ってみるループ テスト変数を作成します。詳細は次のとおりです。


for (语句 1; 语句 2; 语句 3)
{
被执行的代码块
}
ログイン後にコピー

時間を測定して実行するコードを作成します。console.time()< /code> と <code>console.timeEnd() はテスト用です。 🎜🎜これら 3 つの for ループでは、まず 3 つの関数を作成します。それらは 🎜🎜foreach ループのテスト:🎜🎜🎜🎜
for(var i=0;i<10;i++){
console.log(i);
}
ログイン後にコピー
🎜変数宣言のない for ループ:🎜🎜🎜🎜
for(var i=10;i--;){
console.log(i);
}
ログイン後にコピー
🎜 変数宣言の書き方 🎜🎜🎜🎜
for (var i = 0, rule; rule = rules[i++];) {
 //do something
}
ログイン後にコピー
🎜 🎜テスト関数を実行する🎜🎜🎜テスト関数の実行は非常に簡単で、関数を呼び出すだけです🎜🎜🎜🎜
for(var i = 0;i < rules.length;i++){
 var rule = rules[i]
}
ログイン後にコピー
🎜🎜テスト結果🎜🎜🎜10回のテストの後、次の結果が得られました🎜 foreach ステートメントを作成しない ステートメントを作成する 2372.891ms 672.530ms 743.974ms 2431.821ms 710.275ms 805.676ms 2422.448ms 729.287ms 741.014ms 2330.894ms 730.200ms 755.390ms 2423.186ms703.255ミリ秒769.674ミリ秒 2379.167ミリ秒 689.811ミリ秒 741.040ミリ秒 tr> 2372.944ms 712.103ms 710.524ms 2316.005ms 726.518ms 726.522ms 2535.289ms 733.826ms 747.427ms 2560.925ms 793.680ms 817.098ms 平均平均平均 2414.56ms 720.15ms 755.83ms 🎜この結果には驚かれたでしょうか?最も一般的な書き方が最も効率的だとは思いませんでした。なぜでしょうか。よく分からないので知っている人がいたら教えて欲しいのですが、この書き方では意味が無いと思います。 len = arr.length であるため、この arr.length はキャッシュされている可能性があるため、ストレージ用に len 変数を宣言することは意味がありません。 🎜🎜🎜for ループを記述する特別な方法🎜🎜🎜 for ループの基本構文は次のとおりです:🎜🎜🎜🎜rrreee🎜🎜🎜ステートメント 1: ループ (コード ブロック) が開始する前に実行します🎜🎜🎜🎜ステートメント 2:実行ループ (コード ブロック) 条件を定義します 🎜🎜🎜🎜 ステートメント 3: ループ (コード ブロック) が実行された後に実行されます 🎜🎜🎜🎜🎜 for ループを使用して 1 ~ 10 を出力すると、次のように書くことができます: 🎜🎜 🎜🎜えー🎜 でも!上記の文法に従って、このように書くこともできます🎜🎜🎜🎜rrreee🎜最初に読んだときは混乱しました、どうやってこのように書くことができるのですか?ステートメント 2 にはループ条件が含まれており、i- は判定条件です。実際、ステートメント 2 で true が返された場合、ループは実行を継続します。 jsでは、条件判定として0,null,unknown,false,'',""を使用すると結果は偽となり、i-が0に達すると偽となりループが終了します。 🎜🎜記事冒頭のコードに戻る🎜🎜🎜🎜rrreee🎜このrule = rules[i++]が判定条件となり、未定義になった場合にループを終了します。このコードを普通に書くと次​​のようになります: 🎜🎜🎜🎜rrreee🎜 実際には、判断と代入を一緒にして、ループ中に値を代入しているだけです。とても簡単なことではありませんか? 🎜

以上がJavaScript での for ループの記述は実行効率にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!