Pregunta

¿Habrá una gran diferencia de rendimiento 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);

¿Cuál es aconsejable. codificación concisa vs ganancia de rendimiento?

¿Fue útil?

Solución

Yo no esperaría a ver mucha diferencia de rendimiento, y desde luego iría con este último, ya que es más fácil de leer. (Me gustaría poner los frenos alrededor de él sin embargo.)

Es muy fácil imaginar una situación en la que puede que tenga que cambiar el bucle, y con el primer ejemplo, usted podría querer cambiar solamente uno de ellos en lugar de dos. Si realmente quieren evitar llamar a la propiedad Checked en cada iteración, siempre se puede hacer:

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

Como siempre, escribir el código más legible en primer lugar, y la medida / Perfil cualquier diferencia de rendimiento antes de doblar su diseño / código fuera de forma por el bien de rendimiento.

Otros consejos

supongo que la diferencia de rendimiento será apenas perceptible. Sin embargo aquí es una variación que es a la vez eficiente y de fácil lectura:

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

Si lo que busca es una optimización real, también tendrá que prestar atención a si la sobrecarga de ingresar en "this.listBoxColumns" dos veces en cada iteración está presente en el primer lugar y vale la pena prestar atención a. Eso es lo que es para perfiles.

Tiene una comprobación adicional booleano en el primer ejemplo. Pero una vez dicho esto, no me puedo imaginar que la diferencia de rendimiento será insignificante que no sea nada. ¿Usted ha intentado medir esto en su escenario particular?

El segundo ejemplo es preferible ya que no está repitiendo el código de bucle.

No puedo ver que haya una diferencia de rendimiento significativa entre los dos. La forma de confirmar que sería para establecer un punto de referencia y el tiempo de los diferentes algoritmos de más de 1000 de iteraciones.

Sin embargo, ya que es código de interfaz de usuario de cualquier ganancia de rendimiento es prácticamente insignificante como vas a estar esperando a que el usuario lea el cuadro de diálogo y decidir qué hacer a continuación.

En lo personal me gustaría ir para el segundo enfoque cada vez. Usted ha conseguido solamente un bucle de mantener, y el código es más claro.

Cualquier diferencia de rendimiento será insignificante.

Su principal preocupación debe ser la legibilidad del código y facilidad de mantenimiento.

Micro-optimizaciones tales como este son más a menudo que no, fuera de lugar. Siempre perfil antes de preocuparse por el rendimiento.

Es más probable que sea insignificante. Más importante, sin embargo, siento la necesidad de citar los siguientes:

  

"La optimización prematura es la raíz de todo mal"

El segundo es sin duda el más fácil de leer, por lo que simplemente ir con eso, a menos que más adelante encontrará una necesidad de optimizar (que es bastante poco probable en mi opinión).

¿Por qué no usar System.Diagnostics.StopWatch y comparar los dos ti mismo? Sin embargo, no creo que va a haber ninguna diferencia de rendimiento real. El primer ejemplo podría ser más rápido, ya que sólo está accediendo chkSelectAll.Checked vez. Ambos son de fácil lectura sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top