У меня есть два цикла, которые в основном ищут в двух разных массивах (каждый из которых имеет размер около 2-4k на пике) и задают значение в 3-м массиве на основе этих значений. По какой-то странной причине существует разница в два фактора между производительностью этого фрагмента кода, в зависимости от того, в каком порядке я помещаю эти два цикла.Почему это улучшает производительность?
Это первая установка. Он выполняет в ~ 150 миллисекунд на моем компьютере:
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];
}
}
Теперь, если я ничего не меняется, кроме того, петель, как этот
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];
}
}
Общее время работы метода падает до ~ 400 миллисекунд , Как простой обмен порядком цикла улучшает производительность почти на 300%? Я полагаю, что это какая-то вещь для кеширования или указателя?
См. Здесь: http://stackoverflow.com/questions/997212/fastest-way-to-loop-through-a-2d-array –
Каковы длины 'a' и' b'? –
Ответ - это именно та ссылка, которую предоставил @ Майк Дэниелс. это очень известный пример проблемы/оптимизации кэша. –