Question

Je sais qu'en JavaScript, créer une boucle for comme ceci: for(int i = 0; i < arr.length; i++) est coûteux car il calcule la longueur du tableau à chaque fois. Ce comportement est-il coûteux en c # pour les listes et les tableaux également? Ou est-il optimisé au moment de la compilation? Et qu'en est-il des autres langages tels que Java, comment cela est-il géré?

Était-ce utile?

La solution

Cela n'est pas coûteux en C #. D'une part, il n'y a pas de & # 8220; calcul & # 8220;: l'interrogation de la longueur est fondamentalement une opération élémentaire grâce à l'inline. Et deuxièmement, parce que ( d’après ses développeurs ), le compilateur reconnaît ce modèle d’accès et optimise en fait toute vérification des limites (redondante) pour l’accès aux éléments du tableau.

Et au fait, je pense qu’il en va de même pour les machines virtuelles JavaScript modernes, et si ce n’est pas déjà le cas, ce le sera très bientôt car il s’agit d’une optimisation triviale.

Autres conseils

  1. Tous les tableaux .Net ont un champ contenant la longueur du tableau. La longueur n'est donc pas calculée à l'utilisation mais à la création.

  2. La machine virtuelle .Net est très efficace pour éliminer les contrôles de limites chaque fois que cela est possible. C’est l’un des cas dans lesquels la vérification de limites est déplacée en dehors de la boucle (dans la plupart des situations, et si ce n’est que 2 instructions supplémentaires ).

Modifier:

Élimination du contrôle des limites de la matrice

Dans presque toutes les langues, la réponse sera & "Cela dépend &";

.

Généralement, cela dépend si le compilateur est suffisamment intelligent pour savoir si la longueur de la liste ou du tableau peut changer pendant que vous êtes dans la boucle.

Il est cependant peu probable que cela soit défini par la spécification du langage.

Donc, il est probablement prudent de supposer que la compilation pourrait ne pas être en mesure de comprendre cela. Si vous pensez vraiment que la longueur de l'objet ne changera pas, n'hésitez pas à la calculer en premier et à l'utiliser dans vos constructions de contrôle de boucle.

Mais méfiez-vous des autres discussions ...

S'il s'agit de Java, il devrait s'agir d'une opération O (1).

J'ai trouvé le lien suivant utile: http: //www.devguru. com / Technologies / Ecmascript / Quickref / array.html

Cela dépendra également de savoir si le getter effectue un calcul ou accède à une valeur connue.

Je pense que si vous utilisez la méthode d'extension Linq Count (), elle pourra alors être calculée à chaque appel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top