## 单链表与List<T>究竟哪个遍历速度快？

2010-07-02 01:21 by Jeffrey Zhao, ... 阅读, ... 评论, 收藏, 编辑

firelong雄文又起，不过说实话，可能是这篇文章写的太简单了，其中的理由和结论都听得不是很明白。当然有一段话的意思很清楚（原话）：“C#事件的背后是一个委托链表（单链表），单链表的遍历调用性能远低于数组链表（List<T>）”。这句话让我比较纳闷，因为从我的直觉来说，两种做法之间即使性能有差距，也不该是“远高于”啊。不过我提出这个疑问之后，firelong回应到（还是原话）“间接指针移动，和i++哪个快慢很难辨析吗？”于是我想，还是做个试验吧。试验代码很简单：

public class Node
{
public Node Next;
public int Value;
}

public class Item
{
public int Value;
}

class Program
{
static Node GetSingleList(int length)
{
Node root = null;
for (int i = 0; i < length; i++)
{
root = new Node { Next = root, Value = 0 };
}

return root;
}

static List<Item> GetList(int length)
{
return Enumerable.Range(0, length)
.Select(_ => new Item { Value = 0 }).ToList();
}

static void Main(string[] args)
{
int length = 10000;
int iteration = 100000;
int count = 0;

var root = GetSingleList(length);
var watch1 = Stopwatch.StartNew();
for (int t = 0; t < iteration; t++)
{
var node = root;
while (node != null)
{
count += node.Value;
node = node.Next;
}
}
Console.WriteLine("{0} (Node List)", watch1.Elapsed);

GC.Collect();

var list = GetList(length);
var watch2 = Stopwatch.StartNew();
for (int t = 0; t < iteration; t++)
{
for (int i = 0; i < list.Count; i++)
{
count += list[i].Value;
}
}
Console.WriteLine("{0} (List<Item>)", watch2.Elapsed);
}
}

00:00:02.0731861 (Node List)
00:00:02.4602990 (List<Item>)

00:00:02.3176291 (Node List)
00:00:02.2912638 (List<Item>)

00:00:02.1539642 (Node List)
00:00:02.4635390 (List<Item>)