c# - C# 中的 ArrayList 性能测试

标签 c# performance insert arraylist performance-testing

我想对 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/

相关文章:

c# - 西门子 OPC UA 和 .NET C# 客户端无法连接到服务器?

c# - 如何访问已编译的.NET 程序集的 MSIL 代码?

c# - 在 C# 中识别操作系统详细信息

python - 高效读取文件中的某一行

node.js - ArangoDB 插入速度极慢

c# - 从文件中读取文本并解析

java - Proguard 是否会删除仅在一处使用的方法? [方法内联]

performance - 设置 UIImageView 的图像属性会导致严重滞后

html - 如何将 css 插入到博客小工具的 html 中

php - MySQL 中的多查询插入