Si something.awesome es un campo , es probable que se acceda cada vez al ciclo ya que algo en el cuerpo del ciclo puede actualizarlo. Si el cuerpo del bucle es lo suficientemente simple y no llama a ningún método (aparte de los métodos que el compilador en línea), entonces el compilador puede probar que es seguro poner el valor de algo.awesome en un registro. Los escritores del compilador acostumbraban a permitirse el lujo de hacer esto corto de cosas.
Sin embargo, actualmente se necesita mucho tiempo para acceder a un valor desde la memoria principal, pero una vez que el valor ha sido leído por primera vez, es dirigido por la CPU. Leer el valor por segunda vez desde la memoria caché de la CPU tiene una velocidad mucho más cercana a la lectura de un registro que a la lectura desde la memoria principal. No es raro que una memoria caché de la CPU sea cientos de veces más rápida que la memoria principal.
Ahora bien, si something.awesome es una propiedad , entonces es de hecho una llamada al método. El compilador llamará al método cada vez que pasa el ciclo. Sin embargo, si la propiedad/método es solo unas pocas líneas de código, puede estar en línea por el compilador. Inlinear es cuando el compilador ingresa una copia del código del método directamente en lugar de llamar al método, por lo que una propiedad que solo devuelve el valor de un campo se comportará igual que el ejemplo de campo anterior.
Evan cuando la propiedad no está en línea, será en el caché de CPU después de haber sido llamada la primera vez. Así que si es muy complejo o el ciclo se repite muchas veces tarda mucho más en llamar la primera vez en el ciclo, quizás por más de un factor de 10.
En los viejos tiempos, it Solía ser fácil porque todo el acceso a la memoria y las acciones de la CPU tomaban casi el mismo tiempo. En estos días, la memoria caché del procesador puede cambiar fácilmente el tiempo para algunos accesos a la memoria y llamadas a métodos por con un factor de 100. Los perfiladores tienden a suponer que todo el acceso a la memoria toma el mismo tiempo. Entonces, si su perfil se le indicará que haga cambios que pueden no tener ningún efecto en el mundo real.
Cambiar el código para:
int limit = something.awesome;
for(int i = 0; i < limit; i++)
{
// Do cool stuff
}
Will en algunos casos se extienden hacia arriba, sino que también hace que sea más compleja. Sin embargo
int limit = myArray.length;
for(int i = 0; i < limit; i++)
{
myArray[i[ = xyn;
}
es más lento entonces
for(int i = 0; i < myArray.length; i++)
{
myArray[i[ = xyn;
}
como .NET comprobar el atado de las matrices de cada vez que se accede a ellos y tienen lógica para eliminar la marca cuando el bucle es lo suficientemente simple.
Por lo tanto, es mejor mantener el código simple y claro hasta que pueda demostrar que hay un problema. Usted gana mucho mejor si dedica tiempo a mejorar el diseño general de un sistema, esto es fácil de hacer si el código con el que comienza es simple.
Bueno, pruébalo con 'for (int i = 0; i <(i + 2); ++ i)';) – Dario
Solo un lado; there * is * es un escenario donde el JIT hace algo inteligente aquí; con matrices detecta el caso común de '
Hmm, en realidad no confío mucho en el JIT ya que estoy desarrollando XNA, que es un poco peculiar en el 360. Sin embargo, aunque no sea poco apreciado, podría ser útil para PC-apps. :) – Vectovox