Скопируйте массивы быстро в C#
Для копирования массива достаточно просто использовать цикл для, но для большинства массивов вы можете получить еще лучшую производительность, используя Array класс Copy . Это принимает в качестве параметров исходный и целевой массивы. Третий параметр указывает, сколько записей нужно копировать. Дополнительные параметры позволяют копировать из одной части исходного массива в другую часть целевого массива.
Следующий код сравнивает время, необходимое для копирования целочисленного массива с помощью цикла for и с помощью Array.Copy.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// Запуск проб. 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++) { <font color="blue">for (int i = 0; i < num_items; i++) { array2[i] = array1[i]; }</font> } 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++) { <font color="blue">Array.Copy(array1, array2, array1.Length);</font> } 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 может быть быстрее для очень малых массивов.