pour en vs Objet.clé forEach sans propriétés héritées
J'ai été à la recherche à une perf de référence de Object.keys
+ forEach
vs for-in
avec des objets normaux.
Cette de référence montre que Object.keys
+ forEach
est 62% plus lent que le for-in
approche. Mais que faire si vous ne voulez pas d'obtenir la propriétés héritées? for-in
comprend tous les non-natifs hérité d'objets, de sorte que nous allons utiliser hasOwnProperty à vérifier.
J'ai essayé de faire un autre référence ici exactement ce que fait. Mais maintenant, le for-in
approche est 41% plus lent que Object.keys
+ forEach
.
mise à jour
Le test ci-dessus a été fait dans le navigateur Chrome. Testé encore, mais avec Safari et j'obtiens des résultats différents: Object.keys(..).forEach(..) 34% slower
, bizarre.
Note: La raison pour laquelle je suis à l'analyse comparative consiste à vérifier comment il est avec Node.js.
Questions:
- Sont les
jsperf
résultat pour Chrome considérable pour Node.js? - Ce qui s'est passé, comment une seule conditionnelle fait le
for-in
approche 41% plus lent queObject.keys
+forEach
dans Chrome?
- Pouvez-vous mettre en évidence la question(s) ici? Il semble y avoir un certain nombre de réponses.
- Mise à jour de ma question. Désolé pour la confusion.
Vous devez vous connecter pour publier un commentaire.
node.js utilise V8, bien que je pense que ce n'est pas la même que la version actuelle dans Chrome, mais je suppose que c'est un bon indicateur de nœud performances sur le sujet.
Secondairement, vous êtes à l'aide de
forEach
, ce qui est très pratique lors du développement, mais ajoute une fonction de rappel pour chaque itération, et c'est une (relativement) lenghty tâche. Donc, si vous êtes intéressé dans les spectacles, pourquoi ne pas simplement utiliser une normalefor
boucle?Cela donne les meilleures performances, vous pouvez obtenir, la résolution de vos problèmes de vitesse dans Safari aussi.
En bref: ce n'est pas le conditionnel, c'est l'appel à
hasOwnProperty
qui fait la différence. Vous êtes en train de faire un appel de fonction à chaque itération, c'est pourquoifor...in
devient plus lent.; i < keys.length;
à, il = keys.length; i < il;
permettra d'améliorer encore davantage les performances.key
à la positioni
?? votre exemple de code ne mentionne et j'ai besoin de savoir commentkeys[i]
. Votre question, bien que, les conseils que vous avez besoin de lire plus attentivement, ou approfondir vos connaissances de base en JavaScript. (Ou, éventuellement, de mieux expliquer ce que tu veux dire.)Juste à noter que:
ne fonctionnera pas pour l'index 0 et puis vous allez manquer un de vos attributs.
Ce dans un tableau comme ["a","b","c","d"] ne fonctionnera que d,c,b, et vous allez manquer les "a" 'cause de l'indice est de 0 et 0 est faux.
Vous avez besoin pour décrémenter après le temps de vérifier:
Je me suis intéressé à cette question aujourd'hui, en tant que bien, mais surtout parce que je n'aime pas avoir à tester avec hasOwnProperty de passe par défaut de la charpie quand je sais déjà que mes objets sont propres (comme ils l'ont été créés à partir d'objets littéraux). De toute façon, j'ai élargi un peu sur la réponse de @styonsk pour inclure un meilleur rendement et d'exécuter plusieurs tests et de retour de la sortie.
Conclusion: C'est compliqué pour le nœud. Le meilleur moment ressemble à l'aide de l'Objet.les touches() avec un numérique boucle for ou une boucle while sur nodejs v4.6.1. Sur v4.6.1, la forIn boucle avec hasOwnProperty est la méthode la plus lente. Cependant, sur le nœud v6.9.1 il est le plus rapide, mais il est encore plus lent que les deux Objets.les touches() itérateurs sur v4.6.1.
Notes: Cela a été exécuté sur une fin de 2013, le MacBook Pro avec 16 GO de ram et un 2.4 Ghz i5. Chaque test rattachée à 100% d'un seul processeur pour la durée de l'essai et avait une moyenne rss d'environ 500 mo et a culminé à 1 go de rss. Espérons que cela aide quelqu'un.
Ici mes résultats sont en cours d'exécution contre nodejs v6.9.1 et v4.6.1 avec de gros objets (10^6 propriétés) et des petits objets(50 propriétés)
Et voici le code que j'ai couru:
Pour n'importe qui qui regarde encore une itération propriétés de l'objet en JS, l'absolu de la méthode la plus rapide est:
http://jsperf.com/object-keys-foreach-vs-for-in-hasownproperty/8
Vous pouvez économiser un peu sur les grands objets de ne pas avoir à recalculer la valeur de la longueur de la clé array (surtout négligeable avec navigateur moderne optimisations), qui est également vrai pour le cas d'une simple boucle for. Le décrémenté lors de la boucle est encore plus rapide que la boucle for ou la incrémenté lors de la boucle avec la longueur de la limite supérieure en comparaison, par une marge équitable.
0
. Voir la réponse de stackoverflow.com/a/35117591/303016Et pour l'ES6 fans, ressemble à
est de loin le plus rapide.
https://jsperf.com/for-in-vs-for-of-keys-vs-keys-reduce
J'ai testé aujourd'hui. Pour ma part, obtenir les clés de l'Objet et ensuite de faire un simple vieux pour la boucle a été plus rapide que de faire une décrémentation tout ou en boucle. N'hésitez pas à modifier ce modèle pour tester les différentes boucles pour votre cas particulier:
JS:
Vous pouvez exécuter dans votre environnement de test à la place d'un jsfiddle. Essayez plusieurs navigateurs aussi.
console.time
etconsole.timeEnd
pour de tels cas.