Question

Y aura-t une énorme différence de performance entre:

if (this.chkSelectAll.Checked)
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, true);
else
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, false);

vs.

for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
    this.listBoxColumns.SetSelected(i, this.chkSelectAll.Checked);

Lequel est conseillé. codage par rapport à Concise gain de performance?

Était-ce utile?

La solution

Je ne vous attendre à voir beaucoup de différence de performance, et je serais certainement aller avec ce dernier car il est plus facile à lire. (Je mettrais des accolades autour cependant.)

Il est assez facile d'imaginer une situation où vous pourriez avoir besoin de changer la boucle, et avec le premier exemple, vous pouvez accidentellement seulement changer un d'entre eux au lieu de deux. Si vous vraiment veulent éviter d'appeler la propriété Checked à chaque itération, vous pouvez toujours faire:

bool checked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
{
    this.listBoxColumns.SetSelected(i, checked);
}

Comme toujours, écrire le code plus lisible première et mesure / profil de toutes les différences de performance avant de se pencher votre conception / code de forme pour des raisons de performance.

Autres conseils

Je suppose que la différence de performance sera à peine perceptible. Cependant, voici une variation qui est à la fois efficace et très facile à lire:

bool isChecked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) {
    this.listBoxColumns.SetSelected(i, isChecked);
}

Si vous êtes après une optimisation réelle, vous voudrez aussi prêter attention à savoir si les frais généraux d'accès à « this.listBoxColumns » deux fois à chaque itération est présente en premier lieu et mérite l'attention. C'est ce que le profilage est pour.

Vous avez un contrôle booléen supplémentaire dans le premier exemple. Mais après avoir dit cela, je ne peux pas imaginer que la différence de performance sera autre chose que négligeable. Avez-vous essayé de mesure dans votre scénario particulier?

Le deuxième exemple est préférable puisque vous n'êtes pas répéter le code de la boucle.

Je ne vois pas qu'il y ait une différence significative de performance entre les deux. La façon de confirmer qu'il serait de mettre en place un point de repère et de temps les différents algorithmes sur 1000s d'itérations.

Cependant, comme il est le code de l'interface utilisateur tout gain de performance est assez vide de sens que vous allez attendre à l'utilisateur de lire la boîte de dialogue et de décider quoi faire.

Personnellement, je vais pour la deuxième approche à chaque fois. Vous avez seulement une boucle pour maintenir, et le code est plus clair.

Toute différence de performance sera négligeable.

Votre principale préoccupation devrait être la lisibilité et la maintenabilité du code.

Micro-Optimisations tels que ce sont plus souvent qu'autrement, mal placé. Toujours le profil avant d'être concerné par la performance.

Il est plus susceptible d'être négligeable. Plus important encore, cependant, je ressens le besoin de citer ce qui suit:

  

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

La seconde est facilement le plus facile à lire, si simplement aller avec cela, à moins de trouver plus tard un besoin d'optimiser (ce qui est assez peu probable à mon avis).

Pourquoi ne pas utiliser System.Diagnostics.StopWatch et comparer les deux vous-même? Cependant, je ne crois pas qu'il y aura une réelle différence de performance. Le premier exemple est peut-être plus rapide parce que vous êtes seulement accès à chkSelectAll.Checked fois. Les deux sont facilement lisibles cependant.

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