In my mind, List
is basically implemented using LinkedList
, while a normal Array
is implemented as contiguous blocks. I always used List
because it is in the Generic
namespace and because I thought it used dynamic memory allocation - but I was wrong.
Yesterday I saw the implementation of List
using Reflector and found it is actually an array of T(T[]
). There are lots of Array.Copy
around while manipulating each element in the List
. For instance, when you use Insert
, it will create a new memory and copy all the elements before/after the inserted elements. So it seem to me the use of List
is very expensive.
I saw the SortedList
as well. I am not sure why a SortedList
also implements an array inside it. Don't you think SortedList
would be horrible to use an array as you need to sort the list every time a minor manipulation to the List
occurs?
I also wonder why List
is so popular as most people use it rather than going for LinkedList
. Is it only because of the flexibility of the indexer?
Yes, SortedList is O(n) for inserts. Use carefully.
The biggest reason is modern computer design. The CPU cache is very important because RAM is so slow. The memory bus design just couldn't keep up with the rapid advances in CPU clock speeds. Making a high frequency digital signal travel more than an inch is very difficult.
An array has unbeatable cache performance, it very likely that the next element is already in the cache when you iterate it. A linked list gives very small odds that this is the case, the next item is essentially at a random address. That's expensive, it stalls the processor, waiting for the RAM to catch up. Can be hundreds of cycles.