@daniil14056

Почему двумерные массивы работают чуть быстрее одновременых?

internal class Program
    {
        static void Main(string[] args)
        {
            int k = 10_000;
            Console.WriteLine("Hello, World!");
            Stopwatch s = new Stopwatch();
            int[][] a1 = new int[k][];
            int[,] a2 = new int[k, k];
            int[] a3 = new int[k * k];
            for (int i = 0; i < k; i++)
            {
                a1[i]=new int[k];
                for (int j = 0; j < k; j++)
                {
                    a1[i][j] = Random.Shared.Next(10000);
                    a2[i,j] = a1[i][j];
                    a3[j+k*i] = a1[i][j];
                }
            }
            int n = 20;
            long sum = 0;
            s.Start();
           
            for (int l = 0; l < n; l++)
            {
                for (int i = 0; i < k; i++)
                {
                     
                    for (int j = 0; j < k; j++)
                    {
                        sum+=a1[i][j]  ; 
                    }
                }
            }
           
            s.Stop();
            Console.WriteLine(" sum:" + sum + ",  "+s.ElapsedMilliseconds);
            s.Restart();
            sum = 0;
            for (int l = 0; l < n; l++)
            {
                for (int i = 0; i < k; i++)
                {

                    for (int j = 0; j < k; j++)
                    {
                        sum += a2[i, j]  ; 
                    }
                }
            }
            s.Stop();
            Console.WriteLine(" sum:" + sum + ",  " + s.ElapsedMilliseconds);
            s.Restart();
            sum = 0;
            for (int l = 0; l < n; l++)
            {
                for (int i = 0; i < k; i++)
                {
                    int _i = i * k;
                    for (int j = 0; j < k; j++)
                    {
                        sum += a3[j +_i] ;
                    }
                }
            }
            s.Stop();
            Console.WriteLine(" sum:" + sum + ",  " + s.ElapsedMilliseconds); 
        }
    }
// [][] 4865
//[,]    5192
//[]   4852

Почему arr[x][y] на уровне, чем arr[x+ _y], _u=w*y ?

А например в примерах, что выпадают в сети, там даже без микро оптимизации, цифры другие, и одномерный в раза 2 быстрее. Почему у меня не так.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 1
WNeZRoS
@WNeZRoS
// [][] 4865
// [,]  5192
// []   4852


int[] - простейший массив, в памяти лежит линейно.
Работает за счёт IL инструкций (newarr, ldelem, ...), которые могут лучше оптимизировать jit компилятором

int[,] - многомерный массив, в памяти лежит также линейно как int[].
Работает через вызовы методов, а так же за счёт не популярности работает на общем коде с массивами где первый элемент может быть не по индексу 0. Соответственно, для доставания элементов требуется дополнительная математика и проверки.

int[][] - массив массивов, в памяти линейно лежат ссылки на линейно лежащие строки.
Работает медленнее int[] потому что требуется доступ к другим участкам памяти (строкам).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы