Pregunta

¿Cuál de los siguientes tiene el mejor rendimiento?

He visto el método dos implementado en JavaScript con enormes ganancias de rendimiento; sin embargo, no pude medir ninguna ganancia en C# y me preguntaba si el compilador ya utiliza el método 2 incluso cuando está escrito como el método 1.

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, simplemente puede acceder al 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
}
¿Fue útil?

Solución

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

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

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

En resumen, el compilador no realizará 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 del bucle y ver que esta variable en particular no ha cambiado, podría hacerlo y cargar el valor en un registro antes de iniciar el bucle, pero cualquier ganancia de rendimiento de esto Lo más probable es que sea insignificante, a menos que el cuerpo del bucle esté vacío.

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


Editar: Vuelva a leer su publicación y sí, es posible que también vea ganancias de rendimiento insignificantes para sus dos casos, porque JITter optimiza el código.El JITter puede optimizar la lectura del í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 el contrario leer esa propiedad fuera una operación muy costosa, verías una diferencia más notoria.

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