328 votes

Différence entre la déclaration de variables avant ou en boucle ?

Je me suis toujours demandé si, en général, la déclaration d'une poubelle variable avant la boucle, comme opposé à plusieurs reprises à l'intérieur de la boucle, fait tout (performance) différence? Un (tout à fait inutile) exemple en Java:

a) déclaration avant la boucle:

double intermediateResult;
for(int i=0; i < 1000; i++){
    intermediateResult = i;
    System.out.println(intermediateResult);
}

b) déclaration (à plusieurs reprises) à l'intérieur de la boucle:

for(int i=0; i < 1000; i++){
    double intermediateResult = i;
    System.out.println(intermediateResult);
}

Lequel est le mieux, a ou b?

Je soupçonne que l'exposition répétée à la déclaration de la variable (exemple b) crée plus de surcharge en théorie, mais que les compilateurs sont assez intelligents de sorte qu'il n'a pas d'importance. Exemple b a l'avantage d'être plus compact et de limiter la portée de la variable à l'endroit où il est utilisé. Encore, j'ai tendance à code, selon exemple une.

Edit: je suis surtout intéressé par les Java cas.

267voto

Daniel Earwicker Points 63298

Quel est le meilleur, a ou b ?

D’un point de vue performance, vous auriez à le mesurer. (Et à mon avis, si vous pouvez mesurer une différence, le compilateur n’est pas très bon).

D’un point de vue entretien, b est préférable. Déclarer et initialiser des variables au même endroit, dans la plus petite portée possible. Ne laissez pas un trou béant entre la déclaration et l’initialisation et ne pollue les espaces de noms de que vous n’avez pas besoin.

225voto

Mark Robinson Points 6587

Eh bien je suis tombé vos exemples A et B 20 fois chacun, une boucle de 100 millions de fois. (JVM - 1.5.0)

A: temps d’exécution moyen :.074 sec

B: temps d’exécution moyen :.067 sec

À ma grande surprise, B était légèrement plus rapide. Aussi rapide que les ordinateurs sont maintenant c’est difficile de dire si vous pouviez avec précision mesurer cela. J’ai d il code le A way ainsi, mais je dirais qu'il n’importe pas vraiment.

66voto

Jon Skeet Points 692016

Cela dépend de la langue et l’utilisation exacte. Par exemple, en c# 1 il ne fait aucune différence. En C# 2, si la variable locale est capturée par une méthode anonyme (ou une expression lambda en c# 3) il peut faire une différence de heurter très.

Exemple :

Sortie :

La différence est que toutes les actions de saisir les mêmes variable, mais chacun a sa propre distinct variable.

35voto

affan Points 1695

Voici ce que j'ai écrit et compilé en .NET

double r0;
for (int i = 0; i < 1000; i++) {
    r0 = i*i;
    Console.WriteLine(r0);
}

for (int j = 0; j < 1000; j++) {
    double r1 = j*j;
    Console.WriteLine(r1);
}

C'est ce que je reçois de réflecteur quand IL est rendu de nouveau dans le code

for (int i = 0; i < 0x3e8; i++)
{
    double r0 = i * i;
    Console.WriteLine(r0);
}
for (int j = 0; j < 0x3e8; j++)
{
    double r1 = j * j;
    Console.WriteLine(r1);
}

Donc, à la fois exactement le même après la compilation. Dans les différentes langues gérées code est converti en IL/ByteCode et au moment de l'exécution de ses converti en langage machine. Ainsi, au langage machine double peut même pas être créé sur la pile peut-être qu'à vous inscrire en tant que code de refléter le fait que c'est une variable temp pour WriteLine fonction. Il y a tout ensemble de règles d'optimisation, juste pour les boucles. Donc personne moyenne ne devriez pas être inquiet à ce sujet, spécialement dans la gestion des langues. Il ya des cas où vous pouvez optimiser gérer du code de l'e.g si vous avez pour concaténer grand nombre de chaînes en utilisant seulement string a; a+=anotherstring[i] vs l'aide d' StringBuilder. Il y a une grande différence de performance entre les deux. Il ya beaucoup de ces cas où le compilateur ne peut pas optimiser votre code, car il ne peut pas comprendre ce qui est prévu dans la plus grande portée. Mais il peut très bien optimiser les choses de base pour vous.

24voto

Michael Haren Points 42641

Il s’agit d’une chasse aux sorcières en VB.net. Le résultat VB ne réinitialiser le var dans cet exemple :

Cet exemple affiche 0 la première fois (VB vars ont des valeurs par défaut lorsqu’elle est déclarée !) mais `` chaque fois après cela.

Si vous ajoutez un `` , cependant, vous obtenez ce que vous vous en doutez :

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