7
votes

Est-ce plus rapide accédant à un tableau JavaScript directement?


1 commentaires

Certaines de la réponse ont tout à fait raison de dire que vous devriez vous inquiéter très peu, ce qui est plus rapide. Le livre est probablement correct - il y a probablement des chances que le gars a fait ses recherches sur les subtilités de la manière dont une mise en œuvre de JS particulière fonctionne. Mais il y a de fortes chances que vous ne faites pas assez de poids lourd sur le client pour garantir une inquiétude


10 Réponses :


0
votes

Il est logique de simplement l'assigner directement à la variable. Probablement plus rapide à écrire aussi. Je dirais que l'article pourrait avoir de la vérité.

Au lieu de devoir avoir la longueur à chaque fois, vérifiez-le contre I, puis attribuez la variable, vous pouvez simplement vérifier si P a pu être défini. Cela nettoie le code et est probablement plus rapide.


2 commentaires

Obtenir sûrement la longueur d'un tableau serait plus rapide que d'interroger le DOM et d'obtenir une nodéliste entière, non?


Eh bien, si vous attribuez la variable à la ligne suivante, il est logique de réduire 2 appels à un.



3
votes

bonne question - je supposerais ne pas appeler la fonction getelementsbytagname () chaque boucle permettrait de gagner du temps. Je pouvais voir cela étant plus rapide - vous ne vérifiez pas la longueur de la matrice, juste que la valeur a été attribuée. XXX

Bien sûr, cela suppose également qu'aucune des valeurs de votre réseau n'est évaluée à "Faux". Un tableau numérique pouvant contenir un 0 va briser cette boucle.


2 commentaires

C'est l'inverse! L'article affirme que Calling Document.getelementsByTagname ("P") [I] est plus rapide - une grande surprise.


Et n'est-ce pas que l'article, c'est un chapitre du livre: PEPEPPIT. com / store / produit.aspx? isbn = 0735713243



3
votes

Si vous le regardez d'une langue comme C #, vous vous attendez à ce que la deuxième déclaration soit plus efficace, cependant c # n'est pas une langue d'interprète.

Comme le guide stipule: votre navigateur est optimisé pour extraire les nœuds de droite des listes en direct et cela fait-il beaucoup plus vite que de les récupérer du "cache" que vous définissez dans votre variable. De plus, vous devez déterminer la longueur chaque itération, peut également entraîner une perte de performance.

Les langues d'interpréteur réagissent différemment des langues compilées, elles sont optimisées de différentes manières.


0 commentaires

1
votes

intéressant. D'autres références semblent sauvegarder l'idée que les nodélistes sont relativement lourds.

La question est ... Qu'est-ce que les frais généraux? Est-ce suffisant pour se soucier? Je ne suis pas un fan d'optimisation prématurée. Cependant, il s'agit d'un cas intéressant, car ce n'est pas seulement le coût de l'itération qui est affecté, il y a des frais généraux supplémentaires, car la nodéliste doit être maintenue dans des modifications apportées à la DOM.

sans autre preuve, j'ai tendance à croire l'article.


0 commentaires

5
votes

"Nous devrions oublier de petites gains d'efficacité, selon environ 97% du temps: l'optimisation prématurée est la racine de tout mal."

- Donald Knuth


Personnellement, je voudrais utiliser votre chemin car il est plus lisible et plus facile à entretenir. Ensuite, j'utiliserais un outil tel que Yslow pour profiler le code et repasser les goulots d'étranglement de la performance.


2 commentaires

D'accord en général, mais ici les sanctions pourraient être assez pernicieuses. Benchmarking Juste la boucle ne montrerait pas l'histoire complète. Je pense que cela peut être un cas où une petite optimisation prématurée a du sens. Soit le code est assez lisible, on est connu (maintenant) pour être meilleur. Pour utiliser une analogie Java: Stringbuffer Ajout ou la concaténation de la chaîne? Nous n'attendons pas les problèmes de GC avant de le faire ???


Ah je déteste cette "réponse" de "optimisation prématurée". Il n'y a rien de mal à vouloir savoir quelle méthode est plus rapide et meilleure. L'optimisation n'est que prématurée si elle fait mal d'une manière ou d'une autre (lisibilité, etc.). Le reste de la citation dit "mais nous ne devrions pas laisser passer nos opportunités dans ce critique 3%. Un bon programmeur ne sera pas bercé dans la complaisance par ce raisonnement, il sera sage de regarder attentivement le code critique; mais seulement après ce code a été identifié. "



0
votes

Je fais généralement cela (déplacez le test de longueur en dehors de la boucle pour la boucle) xxx pré>

ou pour la compacité ... p>

var nl = document.getElementsByTagName("p");
for(var i=0,nll=nl.length;i<nll;i++){
    p = nl[i];
}


0 commentaires

1
votes

Non, cela ne sera pas plus rapide. En réalité, il est presque totalement absurde depuis pour chaque étape de la boucle de la boucle, vous appelez le "getelementsbytagname" qui est une fonction de consommation de temps.

La boucle idéale serait la suivante: P>

nl = document.getElementsByTagName("P");

for (var i = nl.length-1; i >= 0; i--)
{
    p = nl[i];
}


0 commentaires

0
votes

L'auteur de l'article a écrit:

Dans la plupart des cas, cela est plus rapide que de mettre en cache la nodéliste. Dans le deuxième exemple, le navigateur n'a pas besoin de créer l'objet Liste des nœuds. Il n'a besoin que de trouver l'élément à l'index i à ce moment exact.

comme toujours cela dépend. Cela dépend peut-être du nombre d'éléments de la nodelle. Pour moi, cette approche n'est pas sûre si le nombre d'éléments peut changer, cela pourrait causer et indexer de la liaison.


0 commentaires

0
votes

de l'article que vous liez sur:

Dans le deuxième exemple, le navigateur n'a pas besoin de créer l'objet Liste des nœuds. Il n'a besoin que de trouver l'élément à l'index i à ce moment exact.

Ceci est un non-sens. Dans le premier exemple, la liste des nœuds est créée et une référence à celle-ci est détenue dans une variable. Si quelque chose se passe, qui provoque la modification de la liste des nœuds - disons que vous supprimez un paragraphe - alors le navigateur doit alors faire du travail pour mettre à jour la liste des nœuds. Toutefois, si votre code ne provoque pas la liste de la liste, ce n'est pas un problème.

Dans le deuxième exemple, loin de ne pas avoir besoin de créer la liste des nœuds, le navigateur doit créer la liste des nœuds à chaque fois via la boucle , puis trouver l'élément à l'index i. Le fait qu'une référence à la liste des nœuds ne soit jamais affectée à une variable ne signifie pas que la liste ne doit pas être créée, car l'auteur semble penser. La création d'objets est chère (peu importe ce que l'auteur dit à propos des navigateurs "optimisés pour cela"), il va donc s'agir d'une grande performance touchée pour de nombreuses applications.

L'optimisation dépend toujours de l'utilisation réelle du monde réel que vos rencontres de candidature. Des articles tels que cela ne devraient pas être considérés comme disant «toujours fonctionner de cette façon» mais comme étant des collections de techniques, dont l'une pourrait, dans un ensemble de circonstances spécifique, être de valeur. Le deuxième exemple est, à mon avis, moins facile à suivre, et cela le met à lui seul dans le domaine des techniques de Tricksy qui ne devraient être utilisées que s'il existe un avantage éprouvé dans un cas particulier.

(Franchement, je ne fais pas confiance aux conseils offerts par un programmeur qui utilise un nom de variable comme "NL". S'il est trop paresseux pour utiliser des noms significatifs lors de la rédaction d'un tutoriel, je suis content de ne pas avoir à maintenir son code de production.)


0 commentaires

0
votes

Il est inutile de discuter de la théorie lorsque des tests réels seront plus précis et en comparant à la fois la deuxième méthode était clairement plus rapide.

Voici un exemple de code à partir d'un test de référence xxx

en chrome, la première méthode prenait 2324 ms tandis que la seconde a pris 1986 ms.

mais note que Pour 500 000 itérations, il n'y avait qu'une différence seulement 300ms, donc je ne me dérangerais pas du tout.


0 commentaires