c# копирование из 2d массива, включая приведение - PullRequest
0 голосов
/ 28 апреля 2020

Я знаю, что если я хочу скопировать массив того же типа, у меня есть как минимум 3 параметра, я могу использовать double для l oop, использовать Array.copy или Buffer.BulkCopy. Два метода копирования намного быстрее. Смотрите, например, здесь: { ссылка }.

Оба метода копирования позволяют копировать только части массива 2d, но Array.copy требует, чтобы ранг источника и места назначения был одинаковым во время массового копирования. Копировать не надо.

Я получаю данные из интерфейса com и удваиваюсь или получаю int как объект. Допустим, я хочу включить актерский состав в копию. Я могу сделать это:


Stopwatch watch = new Stopwatch();
const int width = 2;
const int depth = 10 * 1000000;
Random r = new Random(100);
object[,] objdata = new object[width, depth];
for (int i = 0; i < width; i++)
{
    for (int j = 0; j < depth; j++)
    {
        objdata[i, j] = r.Next();
    }
}


        int[,] arr2dint = new int[width, depth];
        watch.Reset();
        watch.Start();
        Array.Copy(objdata, 0, arr2dint, 0, objdata.GetLength(0) * objdata.GetLength(1));
        watch.Stop();
        Console.WriteLine("ArrayCopy to 2 dimensional array including cast took {0}", watch.ElapsedMilliseconds);
        watch.Reset();

        var bufferloopcast = new int[width, depth];
        watch.Start();
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < depth; j++)
            {
                bufferloopcast[i, j] = (int)objdata[i, j];
            }
        }
        watch.Stop();
        Console.WriteLine("Loop-copy to 2 dimensional array including cast took {0} ms", watch.ElapsedMilliseconds);

Теперь метод копирования медленнее. Также имеется ограничение на то, что ранг источника и назначения должен быть одинаковым, поэтому я не могу использовать его для копирования только части массива (скажем, только первой строки).

Я не могу заставить работать Buffer.BulkCopy , ошибка должна быть примитивного типа. Я попробовал это, напрасно:

 int[,] buff2dint = new int[width, depth];
        watch.Reset();
        watch.Start();
        int sizeo = Marshal.SizeOf(objdata[0, 0]);
        Buffer.BlockCopy(objdata, 0, buff2dint, 0, objdata.GetLength(0) * objdata.GetLength(1)* sizeo);
        watch.Stop();
        Console.WriteLine("BufferCopy to 2 dimensional array including cast took {0}", watch.ElapsedMilliseconds);

ТАК, почему array.copy стал таким медленным? И каков наилучший метод для копирования 2d-массива или его частей, если вам нужно включить приведение?

1 Ответ

1 голос
/ 28 апреля 2020

А как насчет использования массива массивов вместо 2d-массива?

int [][] buff2dint = new int[width][];
for(int i = 0; i < width; ++i)
{
   buff2dint[i] = new int[depth];
   Buffer.BlockCopy(srcArray, 0, buff2dint[i], depth);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...