65.9K
CodeProject is changing. Read more.
Home

Performance comparison of using a List as opposed to an Array

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.06/5 (13 votes)

Jun 15, 2010

CPOL
viewsIcon

57871

Benchmark both List and string[].

Introduction

The objective of this article is to elucidate you, fellow developers, to really evaluate the need of using a generic List<T> instead of an old string[], since usually the cost is overlooked.

Using the Code

I've built a simple example to compare the performance for reading and writing to a List<string> and a string[]. Concerning the writing time in milliseconds, for 100000 randomly generated items, the string[] outperformed the List<string> by approximately 8ms.

//Write
const int size = 100000;
Stopwatch startList = new Stopwatch();
startList.Start();
List<string> listString = new List<string>(size);
for (int i = 0; i <= size; i++)
{
    string toAdd = Guid.NewGuid().ToString();
    listString.Add(toAdd);
}
startList.Stop();
TimeSpan durationList = startList.Elapsed;

Stopwatch startArray = new Stopwatch();
startArray.Start();
string[] arrayString = new string[size];
for (int i = 0; i < size; i++)
{
    string toAdd = Guid.NewGuid().ToString();
    arrayString[i] = toAdd;
}
startArray.Stop();
TimeSpan durationArray= startArray.Elapsed;

When reading, the string[] outperforms the List<string> by approximately 2.5 times faster!!

//Read
Stopwatch startListRead = new Stopwatch();
startListRead.Start();
for (int i = 0; i <= listString.Count - 1; i++)
{
    string str = listString[i];
}
startListRead.Stop();
TimeSpan durationListRead = startListRead.Elapsed;

Stopwatch startArrayRead = new Stopwatch();
startArrayRead.Start();
for (int i = 0; i <= arrayString.Length - 1; i++)
{
    string str = arrayString[i];
}
startArrayRead.Stop();
TimeSpan durationArrayRead = startArrayRead.Elapsed;

And you can still do this with LINQ to Objects with an array, as you do with your List<string>:

//Perform our LINQ query on an Array just like a List<T>
var result = from i in arrayString
         where i.StartsWith("a")
         select i;

Results:

benchmarkres.png

So, bottom line, you should consider if you really need the List<T> as opposed to an array because there are serious performance costs that will affect your application.

Points of Interest

Creating concerns on performance of instructions being used in your applications.