2008-08-07 8 views
8

¿Cuál de los siguientes ofrece el mejor rendimiento?Comparación de rendimiento de bucle de datos

he visto método de dos implementado en JavaScript con enormes mejoras en el rendimiento, sin embargo, he podido medir cualquier ganancia en C# y se preguntaba si el compilador ya lo hace el método 2, incluso cuando escribe como método 1.

El la teoría detrás del método 2 es que el código no tiene que acceder a DataTable.Rows.Count en cada iteración, puede acceder fácilmente a la int c.

Método 1

for (int i = 0; i < DataTable.Rows.Count; i++) { 
    // Do Something 
} 

Método 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) { 
    // Do Something 
} 

Respuesta

4

No, no puede hacer eso ya que no hay manera de expresar constante en el tiempo de un valor.

Si el compilador debería poder hacer eso, tendría que haber una garantía del código que devuelva el valor de que el valor es constante, y durante la duración del ciclo no cambiará.

Pero, en este caso, puede agregar nuevas filas a la tabla de datos como parte de su ciclo, y por lo tanto depende de usted hacer esa garantía, en la forma en que lo ha hecho.

En resumen, el compilador no hará esa optimización si el índice final no es una variable.

En el caso de una variable, donde el compilador puede simplemente mirar el código de bucle y ver que esta variable particular no se cambia, puede hacer eso y cargar el valor en un registro antes de iniciar el ciclo, pero cualquier la ganancia de rendimiento de esto probablemente sea insignificante, a menos que el cuerpo de tu circuito esté vacío.

Conclusión: Si sabe, o está dispuesto a aceptar, que el índice del ciclo final es constante durante la duración del ciclo, colóquelo en una variable.


Editar: Vuelva a leer su correo, y sí, es posible que vea mejoras de rendimiento insignificantes para sus dos casos así, debido a la fluctuación de fase optimiza el código. JITter podría optimizar su lectura de índice final en un acceso directo a la variable dentro de la tabla de datos que contiene el recuento de filas, y una lectura de memoria no es tan costosa de todos modos. Si, por otro lado, leer esa propiedad fuera una operación muy costosa, verías una diferencia más notoria.

Cuestiones relacionadas