Ho due cicli for che fondamentalmente cercano due array diversi (ciascuno con una dimensione di circa 2-4k al massimo) e impostano un valore in un terzo array basato su questi valori. Per qualche strana ragione c'è una differenza di fattore due tra le prestazioni di questo pezzo di codice in base all'ordine in cui metto i due per loops.Perché questo migliora le prestazioni?
Questa è la prima configurazione. Esegue a ~ 150 millisecondi sul mio 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];
}
}
Ora se cambio nulla, ma l'ordine dei loop come questo
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];
}
}
Il tempo totale di esecuzione del metodo scende a circa ~ 400 millisecondi . In che modo un semplice scambio di ordini in loop migliora le prestazioni di quasi il 300%? Suppongo che sia una sorta di caching o puntatore?
Vedere qui: http://stackoverflow.com/questions/997212/fastest-way-to-loop-through-a-2d-array –
Quali sono le lunghezze di 'a' e' b'? –
La risposta è precisamente quella nel link che @Mike Daniels ha fornito. è un esempio di ottimizzazione/problema relativo alla cache molto noto. –