Pergunta

Haverá uma diferença de desempenho enorme 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);

Qual é aconselhável. Concise codificação ganho de desempenho vs.?

Foi útil?

Solução

Eu não esperaria para ver muita diferença de desempenho, e eu certamente ir com o último, como é mais legível. (Eu ia colocar chaves arredondar-lo embora.)

É bastante fácil de imaginar uma situação em que você pode precisar alterar o loop, e com o primeiro exemplo, você pode acidentalmente alterar apenas um deles, em vez de dois. Se você realmente quer evitar chamando a propriedade Checked em cada iteração, você sempre pode fazer:

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

Como sempre, escrever o código mais legível primeiro lugar, e medida / perfil quaisquer diferenças de desempenho antes de dobrar seu projeto / code fora de forma por causa do desempenho.

Outras dicas

Suponho que a diferença de desempenho será pouco perceptível. No entanto, aqui é uma variação que é eficiente e altamente legível:

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

Se você é depois de algum otimização real, você também vai querer prestar atenção para saber se a sobrecarga de acesso "this.listBoxColumns" duas vezes em cada iteração está presente em primeiro lugar e vale a pena prestar atenção a. Isso é o que profiling é para.

Você tem uma verificação boolean extra no primeiro exemplo. Mas tendo dito isso, eu não posso imaginar que a diferença de desempenho vai ser outra coisa senão insignificante. Você tentou medir isso em seu cenário particular?

O segundo exemplo é preferível desde que você não está repetindo o código de loop.

Não vejo que haja uma diferença significativa de desempenho entre os dois. A forma de confirmar que seria a criação de um ponto de referência e tempo de diferentes algoritmos mais 1000s de iterações.

No entanto, uma vez que o código UI qualquer ganho de desempenho é bastante sem sentido como você está indo para estar à espera de que o usuário leia o diálogo e decidir o que fazer a seguir.

Pessoalmente, eu iria para a segunda abordagem de cada vez. Você só tem um loop para manter, eo código é mais clara.

Qualquer diferença de desempenho será insignificante.

A sua principal preocupação deve ser a legibilidade do código e sustentabilidade.

Micro-otimizações como este são mais frequentemente do que não, extraviado. Sempre perfil antes de se preocupar com o desempenho.

É mais provável que seja insignificante. Mais importante, no entanto, eu sinto a necessidade de citar o seguinte:

"otimização prematura é a raiz de todo mal"

O segundo é facilmente o mais legível, então simplesmente ir com isso, a menos que você mais tarde encontrar uma necessidade de otimizar (que é bastante improvável na minha opinião).

Por que não usar System.Diagnostics.Stopwatch e comparar os dois si mesmo? No entanto, eu não acredito que não vai haver qualquer diferença de desempenho real. O primeiro exemplo pode ser mais rápido, porque você só está acessando chkSelectAll.Checked uma vez. Ambos são, embora de fácil leitura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top