J'ai appris des livres que vous devriez écrire pour une boucle comme celle-ci:
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
donc le arr.length
ne sera pas calculé à chaque fois.
D'autres disent que le compilateur optimisera cela, vous pouvez donc simplement écrire:
for(var i=0; i < arr.length; i++){
// blah blah
}
Je veux juste savoir quelle est la meilleure façon de pratiquer?
javascript
performance
loops
wong2
la source
la source
for ... of
boucle à ce concours? La syntaxe semble encore plus simple qu'une boucle for sans mise en cache, et je veux savoir si je devrais passer à l'utilisation des boucles for.Réponses:
Après avoir effectué ce test avec la plupart des navigateurs modernes ...
http://jsben.ch/dyM52
Actuellement , la forme de boucle la plus rapide (et à mon avis la plus syntaxiquement évidente).
une norme pour la boucle avec la mise en cache de la longueur
Je dirais que c'est certainement un cas où j'applaudis les développeurs de moteurs JavaScript. Un temps d'exécution doit être optimisé pour plus de clarté , pas d'intelligence .
la source
++i
.for(var i=0, len=myArray.length; i<len; ++i)
Vérifiez jsperf.com/caching-array-length/84var
instruction. La façon dont il est écritlen
est en fait délimitée comme vous le suggérez.Le moyen le plus rapide absolu de parcourir un tableau javascript est:
Voir http://blogs.oracle.com/greimer/entry/best_way_to_code_a pour une comparaison complète
la source
var
(sinonlen
devient une variable globale). Voir également jsperf.com/loops pour plus de repères de boucle.En juin 2016 , faire des tests dans le dernier Chrome (71% du marché des navigateurs en mai 2016 et en augmentation):
Je pense que ce fil est trop ancien et qu'il est trompeur pour les programmeurs de penser qu'ils doivent mettre en cache la longueur, ou utiliser des whiles à travers inverse avec des décrémentations pour obtenir de meilleures performances, en écrivant du code moins lisible et plus sujet aux erreurs qu'un simple simple pour la boucle. Par conséquent, je recommande:
Si votre application parcourt de nombreux éléments ou si votre code de boucle se trouve dans une fonction souvent utilisée, une boucle simple pour la réponse est la réponse:
Si votre application ne parcourt pas vraiment beaucoup d'éléments ou si vous avez juste besoin de faire de petites itérations ici et là, l'utilisation du rappel standard forEach ou de toute fonction similaire de la bibliothèque JS de votre choix pourrait être plus compréhensible et moins sujette aux erreurs, car la portée de la variable d'index est fermée et vous n'avez pas besoin d'utiliser de crochets, pour accéder directement à la valeur du tableau:
Si vous avez vraiment besoin de gratter quelques millisecondes tout en itérant sur des milliards de lignes et que la longueur de votre tableau ne change pas au cours du processus, vous pouvez envisager de mettre en cache la longueur dans votre boucle for. Bien que je pense que ce n'est vraiment pas nécessaire de nos jours:
la source
for(let i=0, j=array.length; i < j; i++)
les boucles for for forward accélèrent considérablement. Sur quelques tests, j'ai couru, il a gagné, sur la plupart c'était dans la marge d'erreur ou la boucle inverse.Si la commande n'est pas importante, je préfère ce style:
Il met en cache la longueur et est beaucoup plus court à écrire. Mais il parcourra le tableau dans l'ordre inverse.
la source
i--
un nombre et une fois que le nombre est0
la condition c'estfalse
parce queBoolean(0) === false
.C'est juste 2018 donc une mise à jour pourrait être sympa ...
Et je dois vraiment être en désaccord avec la réponse acceptée . Il diffère sur différents navigateurs. certains font
forEach
plus vite, certainsfor-loop
, et certainswhile
voici une référence sur toutes les méthodes http://jsben.ch/mW36eet puisque vous pouvez voir beaucoup de for-loop comme
for(a = 0; ... )
alors vaut la peine de mentionner que sans les variables "var" seront définies globalement et cela peut considérablement affecter la vitesse, donc ça va ralentir.L'appareil de Duff fonctionne plus rapidement sur l'opéra mais pas sur Firefox
la source
2014
While
est de retourPensez simplement logique.
Regarde ça
for
boucle a 3 paramètresMaintenant, dites-moi pourquoi cela devrait être plus rapide que:
while
n'a qu'un seul paramètreJ'é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.
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 tableauRemarquez la configuration des paramètres:
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:
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 lafor
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/
la source
for
était plus rapide que lewhile
, et j'ai lu une fois sur crome-dev, c'était exactement pour la raison que vous mentionnez. Ce ne serait qu'une question de temps avant dewhile
rattraper son retard. À partir de là, la logique de la première partie de votre réponse tiendra (encore une fois, oui)! Cependant, les implémentations modernes ne suivent plus rigoureusement chaque étape spécifiée par ecma (elles sont optimisées). Puisque maintenant votre moteur n'est plus le goulot d'étranglement le plus visible, on peut désormais remarquer les manquements de cache CPU dans les boucles inverses !http://jsperf.com/caching-array-length/60
La dernière révision de test, que j'ai préparée (en réutilisant une ancienne), montre une chose.
La longueur de la mise en cache n'est pas très importante, mais elle ne nuit pas.
Chaque première exécution du test lié ci-dessus (sur l'onglet fraîchement ouvert) donne les meilleurs résultats pour les 4 derniers extraits (3e, 5e, 7e et 10e dans les graphiques) dans Chrome, Opera et Firefox dans mon Debian Squeeze 64 bits ( mon matériel de bureau ). Les exécutions suivantes donnent un résultat assez différent.
Les conclusions en termes de performances sont simples:
!==
au lieu de<
.shift()
tableau destructif sont également efficaces.tl; dr
De nos jours (2011.10), le schéma ci-dessous semble être le plus rapide.
Gardez à l'esprit que la mise en cache
arr.length
n'est pas cruciale ici, vous pouvez donc simplement testeri !== arr.length
et les performances ne chuteront pas, mais vous obtiendrez un code plus court.PS: Je sais que dans l'extrait de code avec
shift()
son résultat pourrait être utilisé au lieu d'accéder au 0ème élément, mais j'ai en quelque sorte ignoré cela après avoir réutilisé la révision précédente (qui avait des boucles while incorrectes), et plus tard, je ne voulais pas perdre les résultats déjà obtenus.la source
"Le meilleur" comme en pure performance? ou performance ET lisibilité?
La meilleure performance pure est celle-ci, qui utilise un cache et l'opérateur de préfixe ++ (mes données: http://jsperf.com/caching-array-length/189 )
Je dirais que la boucle for sans cache est le meilleur équilibre entre le temps d'exécution et le temps de lecture du programmeur. Chaque programmeur qui a commencé avec C / C ++ / Java ne perdra pas un ms à lire celui-ci
la source
len
nom, il faudrait toujours faire une double prise sur cette première boucle. L'intention de la deuxième boucle est évidente.** cache la longueur du tableau à l'intérieur de la boucle, quelques secondes seront éludées. Dépend des éléments dans le tableau s'il y a plus d'éléments dans le tableau, il y a une différence majeure par rapport à Ms de temps *
**
**
**
**
la source
Cela semble être de loin le moyen le plus rapide ...
Tenez compte du fait que cela consommera le tableau, le mangera et ne laissera plus rien ...
la source
arr.shift();
au lieu dearr.pop()
sorte que l'inverse du tableau puisse être évité.C'est l'année 2017 .
J'ai fait quelques tests.
https://jsperf.com/fastest-way-to-iterate-through-an-array/
Il semble que la
while
méthode soit la plus rapide sur Chrome.On dirait que le décrément gauche (
--i
) est beaucoup plus rapide que les autres (++i
,i--
,i++
) sur Firefox.Cette approche est le jeûne en moyenne. Mais il itère le tableau dans l'ordre inverse.
Si l'ordre à terme est important, utilisez cette approche.
la source
let
vous comparez réellement les performances de création d'étendue au lieu des performances de boucle. L'utilisationlet i = 0, ii = array.length
de vosfor
boucles créera une nouvelle portée pour ces variables à l'intérieur dufor
bloc. Voswhile
exemples ne créent pas de nouvelle portée pour les variables à l'intérieur duwhile
bloc et c'est pourquoi elles sont plus rapides. Si vous utilisezvar
au lieu delet
dans vos boucles for, vous verrez comment les boucles for sont toujours aussi rapides qu'en 2017, mais plus lisibles.var
etlet
ont les mêmes performances - stackoverflow.com/a/32345435/1785975while
exacte la déclaration "d' être plus rapide dans Chrome". Ce n'est que si vous l'utilisez enlet
raison de problèmes de performances de ce mot clé dans Chrome. Si vous utilisezvar
ou avec d'autres navigateurs,for
et qu'ilswhile
sont à peu près les mêmes, celafor
est parfois encore plus rapide en fonction de la référence, et il est plus compact et lisible à mon humble avis.J'écris toujours dans le premier style.
Même si un compilateur est assez intelligent pour l'optimiser pour les tableaux, mais quand même intelligent si nous utilisons DOMNodeList ici ou un objet compliqué avec une longueur calculée?
Je sais quelle est la question des tableaux, mais je pense que c'est une bonne pratique d'écrire toutes vos boucles dans un même style.
la source
i ++ est plus rapide que ++ i, --i et i--
En outre, vous pouvez enregistrer la dernière ligne en faisant arr [i ++] la dernière fois que vous devez accéder à i (mais cela peut être difficile à déboguer).
Vous pouvez le tester ici (avec d'autres tests de boucle): http://jsperf.com/for-vs-ilstpop/5
la source
++i
c'est plus rapide ...En septembre 2017, ces tests jsperf montrent que le modèle suivant est le plus performant sur Chrome 60:
Quelqu'un est-il capable de se reproduire?
la source
J'ai essayé d'autres façons d'itérer un énorme tableau et j'ai découvert que la réduction de moitié de la longueur du tableau, puis l'itération des deux moitiés en une seule boucle est plus rapide. Cette différence de performances peut être observée lors du traitement d' énormes tableaux .
Comparaison des performances (en utilisant timer.js) entre la longueur en cache pour la boucle VS la méthode ci-dessus.
http://jsfiddle.net/tejzpr/bbLgzxgo/
la source
Un autre test jsperf.com: http://jsperf.com/
La boucle inversée while semble être la plus rapide. Le seul problème est que (--i) s'arrêtera à 0. Comment puis-je accéder au tableau [0] dans ma boucle?
la source
while (i--)
la véracité dei
sera testée avant de décrémenter plutôt que de décrémenter puis de tester la véracité.Une boucle while de base est souvent la plus rapide. jsperf.com est un excellent bac à sable pour tester ces types de concepts.
https://jsperf.com/fastest-array-loops-in-javascript/24
la source
La boucle while est un peu plus rapide que la boucle.
Utilisez la boucle while à la place
la source
L'approche la plus rapide est la boucle for traditionnelle. Voici une comparaison de performances plus complète.
https://gists.cwidanage.com/2019/11/11/how-to-iterate-over-javascript-arrays.html
la source
La solution la plus élégante que je connaisse est d'utiliser la carte.
la source
Essaye ça:
la source
Le moyen le plus rapide de boucler dans un tableau consiste à utiliser le filtre. La méthode filter () crée un nouveau tableau avec tous les éléments qui réussissent le test implémenté par la fonction fournie.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
D'après mon expérience, je préfère toujours les filtres, la carte etc.
la source
Depuis 2019, WebWorker est devenu plus populaire, pour les grands ensembles de données, nous pouvons utiliser WebWorker pour traiter beaucoup plus rapidement en utilisant pleinement des processeurs multicœurs.
Nous avons également Parallel.js qui rend WebWorker beaucoup plus facile à utiliser pour le traitement des données.
la source