Gruja82 Ответов: 3

Массив тестирования скорости против Список<int>


В какой-то статье я читал, что массивы работают быстрее, чем общий список, но я получил другие результаты (или я ошибся).

Что я уже пробовал:

static int[] brojevi;

        static List<int> mojaLista = new List<int>(10000);// when capacity not specified elapsed time is 00:00:00.0000199
        
        private void button_Click(object sender, RoutedEventArgs e)
        {
            ////// using array //////////
            //stopWatch.Start();
            //for (int i = 0; i < brojevi.Length - 1; i++)
            //{
            //    i = i + 1;                                  // elapsed time is 00:00:00.0000221
            //}
            //stopWatch.Stop();
            //TimeSpan ms = stopWatch.Elapsed;
            //MessageBox.Show(ms.ToString());

            ////// using list<int> ///////
            stopWatch.Start();
            for (int i = 0; i < mojaLista.Count; i++)
            {
                i = i + 1;                                      // elapsed time is 00:00:00.0000213
            }
            stopWatch.Stop();
            TimeSpan ms = stopWatch.Elapsed;
            MessageBox.Show(ms.ToString());
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //brojevi = new int[10000];
            //for (int i = 0; i < 10000; i++)
            //{
            //    brojevi[i] = i;
            //}

            for (int i = 0; i < 10000; i++)
            {
                mojaLista.Add(i);
            }
        }

3 Ответов

Рейтинг:
24

Dave Kreskowiak

Список всегда будет медленнее массива.

Ваш метод Button_Click, в котором большая часть кода закомментирована, вообще ничего не делает с массивом или списком, если только вы не тестируете свойства Length и Count. Это не очень хороший тест.

Причина, по которой список всегда будет медленнее, заключается в том, как работает список. Внутренне он поддерживает массив. Он управляется методами, представленными списком, и эти методы добавляют накладные расходы на выполнение.

Например, чтобы поместить элемент в массив, вы просто используете индекс в массиве и устанавливаете этот индекс на то, что вы добавляете. Метод Add массива сам поддерживает следующий доступный индекс, но должен проверить, находится ли следующий индекс все еще вне границ выделенного им массива. Если это не так, то необходимо выделить новый массив и переместить в него объекты из старого массива.


Gruja82

Вы правы, я изменил i=i+1 с помощью testLista.Add(i) и результаты получаются при использовании массива - 00:00:00.0000803, а при использовании списка<int> - 00:00:00.0002224.

Рейтинг:
2

OriginalGriff

Как говорит Дейв: массив всегда будет быстрее списка, просто потому, что список-это массив с классом-оболочкой: List<T> - действительно ли это так эффективно, как вы, вероятно, думаете?[^]


Рейтинг:
0

Patrice T

Цитата:
В какой-то статье я читал, что массивы работают быстрее, чем общий список, но я получил другие результаты (или я ошибся).

Вы ошибаетесь!
Проблема в том, что ваш код не пытается получить доступ к списку или массиву.
Ваш код оптимизирован компилятором:
stopWatch.Start();
// because the loop to not do anything with the list, the count is handled as a constant of the loop and accessed once.
int Tmp= mojaLista.Count;
for (int i = 0; i < Tmp; i++)
{
    i = i + 1; // this is only adding 1 to the loop counter
}

а может быть:
stopWatch.Start();
int Tmp= mojaLista.Count;
for (int i = 0; i < Tmp; i+=2)
{
}

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