57 votes

Déclarer un objet à l'intérieur ou à l'extérieur d'une boucle?

Est-il des performances de l'extrait de code suivant?

for (int i=0; i<someValue; i++)
{
    Object o = someList.get(i);
    o.doSomething;
}

Ou est-ce code fait plus de sens?

Object o;
for (int i=0; i<someValue; i++)
{
    o = someList.get(i);
    o.doSomething;
}

Si en code octet ces deux sont totalement équivalents alors évidemment, la première méthode semble de mieux en termes de style, mais je veux m'assurer que c'est le cas.

48voto

Dave Markle Points 44637

Aujourd'hui, dans les compilateurs, pas. Je déclarer des objets dans le plus petit de la portée, je peux, parce que c'est beaucoup plus lisible pour le gars à côté.

16voto

Dan Vinton Points 11975

Pour citer Knuth, qui peut être citant Hoare:

L'optimisation prématurée est la racine de tous les maux.

Si le compilateur produira légèrement plus rapide code en définissant la variable en dehors de la boucle est discutable, et j'imagine qu'il ne sera pas. Je suppose que ça va produire de l'identique du bytecode.

A comparer avec le nombre d'erreurs que vous serez susceptible d'empêcher par correctement la portée de la variable à l'aide de la boucle de la déclaration de...

10voto

Marco Tolk Points 608

Il n'y a pas de perte de performances pour la déclaration de l'Objet o dans la boucle. Le compilateur génère très similaire bytecode et rend la bonne optimisations.

Voir l'article le Mythe - la Définition des variables de boucle à l'intérieur de la boucle est mauvais pour la performance pour un exemple similaire.

7voto

Rolf Rander Points 1764

Vous pouvez démonter le code avec javap -c et vérifier que le compilateur émet en réalité un. Sur ma configuration (java 1.5/mac compilé avec eclipse), le pseudo-code de la boucle est identique.

5voto

Mehrdad Afshari Points 204872

Le premier code est mieux car elle restreint la portée de l' o variable for bloc. À partir d'un point de vue des performances, il pourrait ne pas avoir d'effets en Java, mais il pourrait avoir dans le bas niveau des compilateurs. Ils pourraient mettre la variable dans un registre si vous faites de la première.

En fait, certaines personnes pourraient penser que si le compilateur est muet, le deuxième extrait est de mieux en termes de performances. C'est ce que certains d'instructeur m'a dit au collège et j'ai ri à lui pour cette suggestion! Fondamentalement, les compilateurs d'allouer de la mémoire sur la pile pour les variables locales à une méthode juste une fois au début de la méthode (en ajustant le pointeur de pile) et le relâcher à la fin de la méthode (de nouveau en ajustant le pointeur de pile, en supposant que c'est pas du C++ ou il n'a pas de destructeurs d'être appelé). Donc tout basée sur la pile des variables locales à une méthode sont allouées à la fois, peu importe où elles sont déclarées et la quantité de mémoire dont ils ont besoin. En fait, si le compilateur est idiot, il n'y a pas de différence en termes de performances, mais si c'est assez intelligent, le premier code peut effectivement être mieux comme ça va aider le compilateur à comprendre la portée et la durée de vie de la variable! Par ailleurs, si elle est vraiment intelligente, il ne devrait absolument pas de différence dans les performances, il déduit la portée réelle.

Construction d'un objet à l'aide d' new est totalement différent du déclarant simplement, naturellement.

Je pense que la lisibilité est plus important que la performance et à partir d'un point de vue de la lisibilité, le premier code est certainement mieux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X