J'essaie de donner une vue d'ensemble avec cette réponse.
Les réflexions suivantes entre parenthèses étaient ma conviction jusqu'à ce que je viens de tester le problème récemment:
[[En termes de langages de bas niveau comme C / C ++ , le code est compilé de sorte que le processeur dispose d'une commande de saut conditionnel spéciale lorsqu'une variable est nulle (ou non nulle).
De plus, si vous vous souciez de cette optimisation, vous pouvez aller à la ++i
place de i++
, car il ++i
s'agit d'une commande à processeur unique alors que cela i++
signifiej=i+1, i=j
.]]
Des boucles vraiment rapides peuvent être faites en les déroulant:
for(i=800000;i>0;--i)
do_it(i);
Cela peut être beaucoup plus lent que
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
mais les raisons peuvent être assez compliquées (juste pour mentionner, il y a les problèmes de prétraitement des commandes du processeur et de gestion du cache dans le jeu).
En termes de langages de haut niveau , comme JavaScript comme vous l'avez demandé, vous pouvez optimiser les choses si vous comptez sur des bibliothèques, des fonctions intégrées pour la boucle. Laissez-les décider de la meilleure façon de procéder.
Par conséquent, en JavaScript, je suggère d'utiliser quelque chose comme
array.forEach(function(i) {
do_it(i);
});
Il est également moins sujet aux erreurs et les navigateurs ont la possibilité d'optimiser votre code.
[REMARQUE: non seulement les navigateurs, mais vous aussi avez un espace pour optimiser facilement, redéfinissez simplement la forEach
fonction (en fonction du navigateur) afin qu'elle utilise la dernière supercherie! :) @AMK dit que dans des cas particuliers, il vaut mieux utiliser array.pop
ou array.shift
. Si vous faites cela, mettez-le derrière le rideau. Le plus exagéré est d'ajouter des options forEach
pour sélectionner l'algorithme de bouclage.]
De plus, également pour les langages de bas niveau, la meilleure pratique consiste à utiliser une fonction de bibliothèque intelligente pour les opérations complexes en boucle si cela est possible.
Ces bibliothèques peuvent également mettre des choses (multithread) derrière votre dos et des programmeurs spécialisés les tiennent à jour.
J'ai fait un peu plus de contrôle et il s'avère qu'en C / C ++, même pour les opérations 5e9 = (50,000x100,000), il n'y a pas de différence entre monter et descendre si le test est effectué contre une constante comme @alestanis le dit. (Les résultats JsPerf sont parfois incohérents, mais en gros, ils disent la même chose: vous ne pouvez pas faire une grande différence.)
Il --i
se trouve donc que c'est plutôt une chose "chic". Cela vous fait seulement ressembler à un meilleur programmeur. :)
D'un autre côté, pour se dérouler dans cette situation de 5e9, cela m'a ramené de 12 secondes à 2,5 secondes quand je suis passé de 10 secondes, et à 2,1 secondes quand je suis allé de 20 secondes. C'était sans optimisation, et l'optimisation a réduit les choses à peu de temps. :) (Le déroulement peut être fait à ma façon ci-dessus ou en utilisant i++
, mais cela ne fait pas avancer les choses en JavaScript.)
Dans l'ensemble: conservez i--
/ i++
et ++i
/ les i++
différences dans les entretiens d'embauche, respectez array.forEach
ou d'autres fonctions de bibliothèque complexes lorsqu'elles sont disponibles. ;)