Tengo dos bucles for que básicamente miran en dos matrices diferentes (cada una tiene un tamaño de alrededor de 2-4k en el pico) y establecen un valor en una tercera matriz en función de estos valores. Por algún extraño motivo, hay una diferencia de dos factores entre el rendimiento de esta pieza de código, según en qué orden puse los dos lazos.¿Por qué esto mejora el rendimiento?
Esta es la primera configuración. Se ejecuta en ~ 150 milisegundos en mi PC:
public static int[] SchoolMultiplication(int[] a, int[] b, int numberBase)
{
List<double> times = new List<double>();
TimeTest timeTest = new TimeTest();
int aLen = a.Length;
int bLen = b.Length;
int[,] resultMatrix = new int[a.Length + b.Length, aLen];
int[] result = new int[a.Length + b.Length];
timeTest.Start();
for (int horizontalIndex = 0; horizontalIndex < b.Length; horizontalIndex++)
{
for (int verticalIndex = 0; verticalIndex < a.Length; verticalIndex++)
{
resultMatrix[a.Length + b.Length - 1 - verticalIndex - horizontalIndex, verticalIndex] = a[a.Length - verticalIndex - 1] * b[b.Length - horizontalIndex - 1];
}
}
Ahora si cambio de nada más que el orden de los bucles como esto
for (int verticalIndex = 0; verticalIndex < a.Length; verticalIndex++)
{
for (int horizontalIndex = 0; horizontalIndex < b.Length; horizontalIndex++)
{
resultMatrix[a.Length + b.Length - 1 - verticalIndex - horizontalIndex, verticalIndex] = a[a.Length - verticalIndex - 1] * b[b.Length - horizontalIndex - 1];
}
}
El tiempo total de ejecución del método se reduce a unos ~ 400 milisegundos . ¿Cómo un simple intercambio de orden de bucles mejora el rendimiento en casi un 300%? Supongo que se trata de algún tipo de funcionamiento de almacenamiento en caché o puntero?
Vea aquí: http://stackoverflow.com/questions/997212/fastest-way-to-loop-through-a-2d-array –
¿Cuáles son las longitudes de 'a' y' b'? –
La respuesta es precisamente la que está en el enlace que proporcionó @Mike Daniels. es un ejemplo de problema/optimización relacionado con caché muy conocido. –