2D массив против 1D массив - PullRequest
       20

2D массив против 1D массив

4 голосов
/ 13 августа 2011

Я прочитал вопрос для Производительность 2-мерного массива по сравнению с 1-мерным массивом

Но в заключение он говорит, что может быть одинаковым (в зависимости от собственной функции карты, Cделает это автоматически)? ...

У меня есть матрица с 1000 столбцами и 440 000 000 строк , где каждый элемент представляет собой double in C# ...

Если я делаю некоторые вычисления в памяти, какой из них лучше использовать в аспекте производительности?(обратите внимание, что у меня есть память, необходимая для хранения такого огромного количества информации) ...

Ответы [ 3 ]

6 голосов
/ 13 августа 2011

Если вы спрашиваете, что лучше: двумерный массив размером 1000x44000 или одномерный массив размером 44000000, в чем разница с объемом памяти?У вас все еще одинаковое количество элементов!В случае производительности и понятности, 2D, вероятно, лучше.Представьте себе, что вам нужно вручную находить каждый столбец или строку в одномерном массиве, когда вы точно знаете, где они находятся в двумерном массиве.

2 голосов
/ 08 мая 2015

Это зависит от того, сколько операций вы выполняете. В приведенном ниже примере я устанавливаю значения массива 2500 раз. Размер массива составляет (1000 *1000* 3). Массив 1D занял 40 секунд, а массив 3D занял 1:39 минут.

var startTime = DateTime.Now;
Test1D(new byte[1000 * 1000 * 3]);
Console.WriteLine("Total Time taken 1d = " + (DateTime.Now - startTime));

startTime = DateTime.Now;
Test3D(new byte[1000,1000,3], 1000, 1000);
Console.WriteLine("Total Time taken 3D = " + (DateTime.Now - startTime));

public static void Test1D(byte[] array)
{
    for (int c = 0; c < 2500; c++)
    {
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = 10;
        }
    }
}

public static void Test3D(byte[,,] array, int w, int h)
{
    for (int c = 0; c < 2500; c++)
    {
        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                array[i, j, 0] = 10;
                array[i, j, 1] = 10;
                array[i, j, 2] = 10;
            }
         }
     }
}
1 голос
/ 13 августа 2011

Разница между double[1000,44000] и double[44000000] не будет значительной.

Вероятно, вам лучше использовать версию [,] (позволяющую компилятору выяснить адресацию. Но схема ваших вычислений, вероятно, окажет большее влияние (использование локальности и кэша).

Также рассмотрим вариант «массив-массив», double[1000][]. Это известная «особенность» джиттера, которая не может устранить проверку диапазона в массивах [,].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...