diferença de desempenho em looping
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.?
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:
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.