我想对 ArrayList(System.Collections - C#) 在开头插入项目的速度进行性能测试。
我打开了一个文件来读取数据行,设置了一个秒表,还创建了一个 ArrayList 来添加项目(如下所示):
Stopwatch watchTime = new Stopwatch();
Double totalTime = 0;
using (StreamReader readText = new StreamReader("data.txt"))
{
String line;
Int32 counter = 0;
while ((line = readText.ReadLine()) != null)
{
}
}
我使用计数器来跟踪我输入 ArrayList 的项目数量。
在 while 循环中我有以下内容:
watchTime.Start();
theList.Insert(0, line);
watchTime.Stop();
Double time = watchTime.Elapsed.TotalMilliseconds;
totalTime = totalTime + time;
Console.WriteLine(time);
watchTime.Reset();
++counter;
这是检查将项目插入 ArrayList 开头的速度有多快的正确方法吗?
我制作了另一个做完全相同事情的程序 - 但是使用字典。令我惊讶的是,这个 ArrayList 插入项目所花费的时间比 Dictionary 所花费的时间长得多。为什么会这样?
最佳答案
好吧,我建议:
- 不要使用文件来获取输入。为什么要在系统中引入IO?
- 无需反复停止和启动秒表,只需在
ArrayList
中插入很多行即可没有做任何其他事情。一次完成那个大循环。
至于为什么Dictionary<,>
更便宜 - 你没有显示任何代码,但基本上你的插入代码必须复制 ArrayList
的全部内容在每次插入时。 ArrayList
维护一个数组来保存列表的内容。通常数组比列表大 - 当你在末尾添加一个元素时,如果可以将新值分配到数组的正确位。如果将它插入别处,它必须复制数组的元素以便为新元素“腾出空间”。
您会发现在最后添加它要快得多。 Dictionary<,>
使用完全不同的数据结构;它必须在某些点调整大小,但通常会有非常不同的特征。
(我建议您使用 List<T>
而不是 ArrayList
开始,如果您想要一个可以在开头重复插入的集合,请考虑 LinkedList<T>
- 或者可能是队列或堆栈,具体取决于关于你以后想用它做什么。)
关于c# - C# 中的 ArrayList 性能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7864816/