2010-12-18 15 views
16

¿Tengo que optimizar mis bucles FOR como a continuación o el compilador hará eso por mí?optimización for-loop - ¿es necesario o no?

//this is slow, right? 
for (int i = 0; i < menuItem.DropDownItems.Count; i++) 
{ 
    ... 
} 

//this should be much faster right? 
for (int i = 0, count = menuItem.DropDownItems.Count; i < count; i++) 
{ 
    ... 
} 

PS. Apuesto a que esto ya fue publicado pero no he encontrado nada, lo siento por un posible dup.

PPS. Lo siento, código mucho JavaScript, donde tenemos que pensar este tipo de optimizaciones ... Puede parecer ridículo en .net-world.

+10

Has escrito el código en ambos sentidos. Si quiere saber cuál es más rápido * ejecútelos, mida el tiempo de cada uno, y luego sabrá *. No es necesario que preguntes en Internet para adivinar cuándo puedes obtener una respuesta definitiva en unos segundos. –

Respuesta

19

Bueno, depende de cómo se implementa DropDownItems.Count - pero francamente es probable a ser una simple propiedad respaldado campo ... lo que haría que el primer código tan rápido como el segundo, pero mucho más fácil de leer .

Legibilidad en primer lugar, luego mida el rendimiento y optimice en micro solo cuando sea necesario.

Siempre que sea posible, prefiera un bucle foreach para comenzar con ... otra vez, por motivos de legibilidad.

Incluso si do quiero usar una variable temporal, mantendría el bucle for en sí mismo simple, esperando el conteo para separar la variable. Hay que admitir que se trata de un alcance más amplio, pero es más simple:

int count = menuItem.DropDownItems.Count; 
for (int i = 0; i < count; i++) 
{ 
    ... 
} 

Sin embargo, eso solo es una preferencia personal.

+0

+1 para el comentario "Legibilidad primero". :) Sin embargo, un bucle 'foreach' no funcionaría directamente aquí debido al reparto, ¿verdad? Por lo tanto, incurriría en conversiones adicionales en cada iteración. – Mehrdad

+0

@Lambert: es difícil de decir en este momento, ya que no hemos visto nada del código en el circuito. Pero si hay un reparto debido al 'foreach', normalmente habrá un molde en el cuerpo del loop con un' for' de todos modos. –

+2

De acuerdo, también con esta interfaz de usuario, el afeitado de ese nanosegundo no va a iluminar realmente el día de nadie. Esto es cacahuete en comparación con el tiempo que tarda en volver a pintar la pantalla. Concéntrese en una interfaz de usuario receptiva al no bloquear el hilo de la interfaz de usuario, que pondrá una sonrisa en la cara de los usuarios. – gjvdkamp

0

¿Cuál es la pieza ...? En cualquier pregunta de este tipo, mi primera respuesta es preguntar: "¿Importa incluso, en este caso?" El rendimiento es siempre relativo. Si esa línea exacta de código está en la pila o al final de ella más del 10% del tiempo, entonces vale la pena preocuparse, y eso generalmente es muy poco probable.

Cuestiones relacionadas