Я знаю, что если я хочу скопировать массив того же типа, у меня есть как минимум 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-массива или его частей, если вам нужно включить приведение?