2014 While
est de retour
Pensez simplement logique.
Regarde ça
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Besoin de créer au moins 2 variables (index, longueur)
- Besoin de vérifier si l'indice est plus petit que la longueur
- Besoin d'augmenter l'indice
- la
for
boucle a 3 paramètres
Maintenant, dites-moi pourquoi cela devrait être plus rapide que:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Une variable
- Pas de chèques
- l'indice est diminué (les machines préfèrent cela)
while
n'a qu'un seul paramètre
J'étais totalement confus lorsque Chrome 28 a montré que la boucle for est plus rapide que le temps. Cela doit avoir ben une sorte de
"Euh, tout le monde utilise la boucle for, concentrons-nous sur cela lors du développement pour Chrome."
Mais maintenant, en 2014, la boucle while est de retour sur le chrome. c'est 2 fois plus rapide, sur les autres navigateurs / anciens, c'était toujours plus rapide.
Dernièrement, j'ai fait de nouveaux tests. Maintenant, dans le monde réel, ces codes courts ne valent rien et jsperf ne peut pas réellement exécuter correctement la boucle while, car il doit recréer le array.length, ce qui prend également du temps.
vous ne pouvez pas obtenir la vitesse réelle d'une boucle while sur jsperf.
vous devez créer votre propre fonction personnalisée et vérifier cela avec window.performance.now()
Et oui ... il n'y a aucun moyen que la boucle while soit simplement plus rapide.
Le vrai problème est en fait la manipulation du dom / le temps de rendu / le temps de dessin ou comment vous voulez l'appeler.
Par exemple, j'ai une scène de toile où j'ai besoin de calculer les coordonnées et les collisions ... cela se fait entre 10-200 MicroSecondes (pas millisecondes). il faut en fait plusieurs millisecondes pour tout rendre. Tout comme dans DOM.
MAIS
Il existe une autre manière super performante d'utiliser le for loop
dans certains cas ... par exemple pour copier / cloner un tableau
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Remarquez la configuration des paramètres:
- Identique à la boucle while, j'utilise une seule variable
- Besoin de vérifier si l'indice est supérieur à 0;
- Comme vous pouvez le voir, cette approche est différente de la normale pour la boucle que tout le monde utilise, car je fais des choses à l'intérieur du 3ème paramètre et je diminue également directement à l'intérieur du tableau.
Cela dit, cela confirme que des machines comme le -
en écrivant que je pensais à le raccourcir un peu et à supprimer des trucs inutiles et j'ai écrit celui-ci en utilisant le même style:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Même s'il est plus court, il semble que l'utilisation d' i
une fois de plus ralentit tout. C'est 1/5 plus lent que la for
boucle précédente et celle- while
là.
Remarque: le ;
est très important après le pour looo sans{}
Même si je viens de vous dire que jsperf n'est pas le meilleur moyen de tester des scripts .. j'ai ajouté ces 2 boucles ici
http://jsperf.com/caching-array-length/40
Et voici une autre réponse sur les performances en javascript
https://stackoverflow.com/a/21353032/2450730
Cette réponse est de montrer des façons d'écrire javascript performantes. Donc, si vous ne pouvez pas lire cela, demandez et vous obtiendrez une réponse ou lirez un livre sur javascript http://www.ecma-international.org/ecma-262/5.1/