Maison >interface Web >js tutoriel >Quel impact l'écriture de boucles for en JavaScript a-t-elle sur l'efficacité de l'exécution ?

Quel impact l'écriture de boucles for en JavaScript a-t-elle sur l'efficacité de l'exécution ?

伊谢尔伦
伊谢尔伦original
2017-07-19 14:40:572448parcourir

L'impact de l'écriture de boucle for sur l'efficacité

En général, il existe deux manières d'écrire une boucle for :

  1. Pas d'écriture Comment pour déclarer des variables : for(var i = 0;i<arr.length;i++){}

  2. Comment déclarer des variables : for(var i = 0,len = arr.length;i < len;i++){}

En plus des boucles for, il existe aussi forEach() , il y a aussi des articles qui disent que forEach() est le plus efficace, et il est recommandé d'utiliser la méthode d'écriture forEach(), alors laquelle est la plus efficace ? Faisons un test et voyons.

Plan de test

Le plan de test global est le suivant :

  1. Créez une variable de tableau de test contenant 40 millions.

  2. Utilisez deux méthodes d'écriture de boucle for et foreach pour parcourir cette variable de test.

  3. Sur la même machine stable, réalisez 10 tests et faites enfin la moyenne.

  4. Environnement de test : CPU : Inter(R) Core i5-3210M, RAM : 12GM, système : win10 (x64)

Processus de test

Création d'une variable de test

Utilisez d'abord une boucle while pour créer une variable de test. C'est très simple. comme suit :


var testArrs = [],
 i = 0;
while(i<40000000){
 testArrs.push(i);
 i++;
}

Écrivez la fonction de test correspondante

pour mesurer et exécuter le code temporel que j'utilise et console.time() pour tester. console.timeEnd()

Pour ces trois boucles for, créez d'abord trois fonctions, ce sont

Test de boucle foreach :


function testForeach(testArrs){
 console.time(&#39;foreach&#39;);
 var newArrs = [];
 testArrs.forEach(function(i){
 newArrs.push(i);
 });
 console.timeEnd(&#39;foreach&#39;);
}
Boucle For sans déclaration de variable :


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;);
}
Écriture avec déclaration de variable


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;);
}

Exécuter la fonction de test

L'exécution de la fonction de test est très simple, il suffit d'appeler la fonction


testForeach(testArrs);
testNoDeclare(testArrs);
testUseDeclare(testArrs);

Résultats du test

Après 10 tests, les résultats suivants ont été obtenus

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.186ms 703.255ms 769.674ms
2379.167ms 689.811ms 741.040ms
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
Je me demande si les résultats vous ont surpris ? Je ne m'attendais pas à ce que la manière d'écrire la plus courante soit la plus efficace. Pourquoi ? Je n’ai pas compris, donc si quelqu’un le sait, dites-le-moi, mais je suppose que la façon dont la déclaration est écrite n’a aucun sens. Parce que

ceci len = arr.length a peut-être été mis en cache, cela n'a donc aucun sens pour nous de déclarer une variable len pour la stocker. arr.length

Manière spéciale d'écrire la boucle for

La syntaxe de base de la boucle for est :


for (语句 1; 语句 2; 语句 3)
{
被执行的代码块
}
  1. Instruction 1 : Exécuter

  2. avant le début de la boucle (bloc de code) Instruction 2 : Définir les conditions d'exécution de la boucle (bloc de code)

  3. Instruction 3 : Exécuter après l'exécution de la boucle (bloc de code)

  4. Si nous utilisons une boucle for pour sortir 1 à 10, nous pouvons écrire :


Mais ! D'après les instructions grammaticales ci-dessus, nous pouvons également l'écrire comme ceci
for(var i=0;i<10;i++){
console.log(i);
}


Quand je l'ai lu pour la première fois, j'étais confus, comment pouvait-il être écrit comme ça ? L'instruction 2 contient la condition de boucle et i- est la condition de jugement. En fait, dans l'instruction 2, si true est renvoyé, la boucle continuera à s'exécuter. En js, lorsque 0,null,undefined,false,'',"" est utilisé comme jugement conditionnel, le résultat est faux, ce qui signifie que lorsque i- atteint 0, il est faux et la boucle se termine.
for(var i=10;i--;){
console.log(i);
}

Retournez au code au début de l'article


Cette règle = règles[i++] est la condition de jugement Quand elle devient. indéfini, la boucle sera terminée La. Donc si ce code est écrit de manière ordinaire, il ressemblerait à ceci :
for (var i = 0, rule; rule = rules[i++];) {
 //do something
}


En fait, il met simplement le jugement et l'affectation ensemble, et attribue des valeurs en boucle. N'est-ce pas assez simple ?
for(var i = 0;i < rules.length;i++){
 var rule = rules[i]
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn