Domanda

Ci sarà una grande differenza di prestazioni tra:

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 è consigliabile. codifica Concise vs guadagno di prestazioni?

È stato utile?

Soluzione

Non mi aspetto di vedere molto differenza di prestazioni, e mi piacerebbe sicuramente andare con quest'ultimo in quanto è più leggibile. (Avevo messo le parentesi intorno ad esso però.)

E 'abbastanza facile immaginare una situazione in cui potrebbe essere necessario cambiare il ciclo, e con il primo esempio si potrebbe accidentalmente modificare solo uno di loro, invece di entrambi. Se davvero vuole evitare di chiamare la proprietà Checked in ogni iterazione, si può sempre fare:

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

Come sempre, scrivere il codice più leggibile prima, e la misura / profilo eventuali differenze di prestazioni prima di piegare il disegno / code fuori forma per il bene di prestazioni.

Altri suggerimenti

Credo che la differenza di prestazioni sarà appena percettibile. Tuttavia qui è una variante che è sia efficiente e altamente leggibile:

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

Se siete dopo qualche reale ottimizzazione vorrete anche prestare attenzione al fatto che il sovraccarico di accesso "this.listBoxColumns" due volte ad ogni iterazione è presente in primo luogo, e vale la pena prestare attenzione a. Questo è ciò che è per il profiling.

Si dispone di un controllo supplementare booleano nel primo esempio. Ma detto questo, non riesco a immaginare che la differenza di prestazioni sarà altro che trascurabile. Hai provato a misurare questo scenario particolare?

Il secondo esempio è preferibile in quanto non si è di ripetere il codice di ciclo.

Non riesco a vedere che vi sia una differenza di prestazioni significative tra i due. Il modo per confermare che sarebbe stato di creare un punto di riferimento e di tempo i diversi algoritmi di oltre 1000 di iterazioni.

Tuttavia, come è il codice utente qualsiasi guadagno di prestazioni è abbastanza insignificante come si sta andando ad essere in attesa per l'utente di leggere il dialogo e decidere cosa fare dopo.

Personalmente mi piacerebbe andare per il secondo approccio ogni volta. Hai un solo ciclo per mantenere, e il codice è più chiaro.

Qualsiasi differenza di prestazioni sarà trascurabile.

La vostra preoccupazione principale dovrebbe essere la leggibilità del codice e la manutenibilità.

I micro-ottimizzazioni come questo sono il più delle volte, fuori luogo. profilo sempre prima di essere interessati con le prestazioni.

E 'più probabile che trascurabile. Ancora più importante, però, sento il bisogno di citare il seguente:

  

"ottimizzazione prematura è la radice di tutti i mali"

Il secondo è facilmente il più leggibile, così semplicemente andare con quella, a meno che in seguito trovare un bisogno di ottimizzare (che è abbastanza improbabile che a mio parere).

Perché non usare System.Diagnostics.StopWatch e confrontare i due da soli? Tuttavia, non credo che ci sara 'alcuna differenza di prestazioni reali. Il primo esempio potrebbe essere più veloce perché si sta solo accedendo chkSelectAll.Checked volta. Entrambi sono facilmente leggibili però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top