Почему generic.list медленнее, чем массив?
Сравнение общего списка с массивом
Ответы (2)
Общий список немного медленнее, чем массив, но в большинстве случаев вы этого не заметите. В основном это связано с более сложным поиском: говорят, что List использует массив «под капотом», но не гарантируется, что узлы в соседней памяти будут храниться так же, как в массиве.
Однако я видел несколько тестов еще в 2005 году (сейчас не могу найти ссылку), и разница очень невелика.
Кроме того, список имеет ряд важных преимуществ по сравнению с массивом: в основном это тривиальное добавление или удаление элементов. Гораздо проще использовать список, если вы не знаете, сколько элементов вам понадобится или когда это количество будет отличаться. В таких случаях (и, честно говоря, большую часть времени) вам, вероятно, не следует не использовать массив.
Что касается производительности чтения, есть два фактора:
- дополнительное разыменование (т.е.
List<T>
будет содержать полеT[]
и должно разыменовать его) - он не может использовать некоторые оптимизации компилятора, которые существуют для
T[]
- например, устранение проверки границ во время циклов
Однако гораздо проще добавить List<T>
, в частности, потому что он сохраняет свободное пространство, т.е. ему не нужно изменять размер / копировать весь массив только для того, чтобы добавить один элемент.