J'ai deux pour les boucles qui recherchent essentiellement dans deux tableaux différents (chacun ayant une taille autour de 2-4k à la crête) et définissez une valeur dans un troisième tableau en fonction de ces valeurs. Pour une raison étrange, il existe un facteur deux différence entre les performances de ce morceau de code en fonction de l'ordre dans lequel j'ai mis les deux pour les boucles.Pourquoi cela améliore-t-il les performances?
Ceci est la première configuration. Il exécute en ~ 150 millisecondes sur mon 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];
}
}
Maintenant, si je change rien, mais l'ordre des boucles comme celui-ci
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];
}
}
La durée totale de la méthode chute à environ ~ 400 millisecondes . Comment un simple échange d'ordre de boucle améliore-t-il les performances de près de 300%? Je suppose que c'est une sorte de mise en cache ou de performance de pointeur?
Voir ici: http://stackoverflow.com/questions/997212/fastest-way-to-loop-through-a-2d-array –
Quelles sont les longueurs de 'a' et' b'? –
La réponse est précisément celle du lien que @Mike Daniels a fourni. c'est un exemple de problème/optimisation lié au cache très connu. –