Скопируйте массивы быстро в 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 может быть быстрее для очень малых массивов.