5 votes

La déclaration de variables à l'intérieur de sous-blocs améliore-t-elle les performances ?

En C#, y aurait-il une différence de performance si l'on comparait les éléments suivants TROIS des alternatives ?

UN

void ONE(int x) {

if (x == 10) 
{
    int y = 20;
    int z = 30;
    // do other stuff
} else {
    // do other stuff
}
}

DEUX

void TWO(int x) {

int y;
int z;

if (x == 10) 
{
    y = 20;
    z = 30;
    // do other stuff
} else {
    // do other stuff
}
}

TROIS

void THREE(int x) {

int y = 20;
int z = 30;

if (x == 10) 
{
    // do other stuff
} else {
    // do other stuff
}
}

4voto

Mark Cidade Points 53945

Toutes choses égales par ailleurs ( et ce n'est généralement pas le cas, c'est pourquoi vous devez normalement le tester. ), ONE() y TWO() devrait générer les mêmes instructions IL puisque les variables locales finissent par s'appliquer à l'ensemble de la méthode. THREE() sera de façon négligeable plus lent si x==10 puisque les deux autres ne prendront pas la peine de stocker les valeurs dans les variables locales.

Les trois occupent la même quantité de mémoire - la mémoire de toutes les variables est allouée même si rien n'y est stocké. Le compilateur JIT peut toutefois effectuer une optimisation ici, s'il recherche des variables inutilisées.

1voto

Justin Niessner Points 144953

Il n'y a pas de différence de performance, mais vous trouverez des problèmes de portée variable entre chacun de ces exemples.

Vous montrez également trois intentions différentes entre ces exemples, ce qui n'est pas ce que vous voulez :

  1. y et z sont limités à la portée de l'instruction if.

  2. y et z sont utilisés en dehors de l'instruction if, mais sont définis de manière conditionnelle.

  3. y et z n'ont rien à voir avec l'instruction if.

1voto

Hans Passant Points 475940

Bien entendu, vous devez toujours pick ONE, il est beaucoup plus lisible. Le fait qu'il soit plus rapide d'une fraction de nanoseconde n'est pas un accident, un code lisible l'est souvent.

0voto

Joshua Points 5367

Je ne pense pas que cela fasse une grande différence. Le seul cas où vous devriez vous inquiéter est celui où la création du nouvel objet et son initialisation sont coûteuses. Vous pouvez toujours essayer de profiler chaque méthode quelques milliers de fois pour voir s'il y a des différences, mais je doute que vous en trouviez.

La seule fois où j'éloigne une déclaration de l'endroit où elle est utilisée, c'est si elle doit être travaillée en boucle, par exemple :

void RunMethod() {
  FormRepresentation formRep = null;
  for (int idx = 0; idx < 10; idx++) {
    formRep = new FormRepresentation();
    // do something
  }
}

Cela ne fait en fait aucune différence puisque l'objet est toujours en cours de création, mais, à mon avis, c'est plus propre. L'autre élément à prendre en compte est la portée de la variable. Les variables déclarées ne peuvent pas être utilisées en dehors de la portée dans laquelle elles ont été déclarées.

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