Maison > interface Web > js tutoriel > le corps du texte

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

伊谢尔伦
Libérer: 2017-07-19 14:40:57
original
2401 Les gens l'ont consulté

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++;
}
Copier après la connexion

É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;);
}
Copier après la connexion
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;);
}
Copier après la connexion
É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;);
}
Copier après la connexion

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);
Copier après la connexion

Résultats du test

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

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
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)
{
被执行的代码块
}
Copier après la connexion
  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);
}
Copier après la connexion


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);
}
Copier après la connexion

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
}
Copier après la connexion


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]
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!