Скопируйте массивы быстро в C#
Для копирования массива достаточно просто использовать цикл для, но для большинства массивов вы можете получить еще лучшую производительность, используя Array класс Copy . Это принимает в качестве параметров исходный и целевой массивы. Третий параметр указывает, сколько записей нужно копировать. Дополнительные параметры позволяют копировать из одной части исходного массива в другую часть целевого массива.
Следующий код сравнивает время, необходимое для копирования целочисленного массива с помощью цикла for и с помощью Array.Copy.
// Запуск проб.
private void btnGo_Click(object sender, EventArgs e)
{
lblForLoop.Text = "";
lblArrayCopy.Text = "";
Cursor = Cursors.WaitCursor;
Application.DoEvents();
int num_items = int.Parse(txtNumItems.Text);
int num_trials = int.Parse(txtNumTrials.Text);
int[] array1 = new int[num_items];
int[] array2 = new int[num_items];
// Инициализировать первый массив.
for (int i = 0; i < num_items; i++)
{
array1[i] = i;
}
DateTime start_time, stop_time;
TimeSpan elapsed;
// Используйте цикл for.
start_time = DateTime.Now;
for (int trial = 0; trial < num_trials; trial++)
{
for (int i = 0; i < num_items; i++)
{
array2[i] = array1[i];
}
}
stop_time = DateTime.Now;
elapsed = stop_time - start_time;
lblForLoop.Text = elapsed.TotalSeconds.ToString("0.00") +
" seconds";
Application.DoEvents();
// Используйте Array.Copy.
start_time = DateTime.Now;
for (int trial = 0; trial < num_trials; trial++)
{
Array.Copy(array1, array2, array1.Length);
}
stop_time = DateTime.Now;
elapsed = stop_time - start_time;
lblArrayCopy.Text = elapsed.TotalSeconds.ToString("0.00") +
" seconds";
Cursor = Cursors.Default;
}
Код получает количество элементов, которые он должен копировать в каждом массиве, и количество испытаний, которое оно должно выполнить. Затем для каждого испытания код использует цикл for для копирования значений массива и отображения прошедшего времени. Затем он копирует значения с помощью Array.Copy. Код, который выполняет два типа испытаний, выделяется синим цветом.
Если вы посмотрите на изображение, показанное выше, вы увидите, что Array.Copy выполняется намного быстрее, в этом примере занимает около 1/17, если для tt >.
Обратите внимание, что общее время чрезвычайно мало (всего около 7 наносекунд на элемент с использованием цикла для) в любом случае. Также обратите внимание, что цикл for может быть быстрее для очень малых массивов.
