.net - 在 SortedList 中循环 - 为什么这样更快?

标签 .net vb.net containers sortedlist

以下示例中的 List1 是一个 SortedList(Of MyClass),包含 251 个成员。

前两个代码块在 15.5 秒内执行。

 For cnt As Integer = 1 To 1000000
        For Each TempDE In List1
            Dim F As String = TempDE.Key
            TempDE.Value.x1 = 444
        Next
    Next
    For cnt As Integer = 1 To 1000000
        For Each TempDE As KeyValuePair(Of String, phatob) In List2
            Dim F As String = TempDE.Key
            TempDE.Value.x1 = 444
        Next
    Next

这个在 5.6 秒内执行。
    For cnt As Integer = 0 To 999999
        For cnt2 As Integer = 0 To 250
            Dim F As String = List1.Keys(cnt2)
            List1.Values(cnt2).x1 = 444
        Next

    Next

为什么前两个代码块这么慢?

最佳答案

SortedList 通过实现 IComparer 来扩展 Collection 以提供排序功能。在内部,它实现了 2 个数组来存储列表的元素——一个数组用于键,一个数组用于值。 .NET 数组针对快速有序和快速随机访问进行了优化。

我怀疑为什么前 2 个很慢是因为 SortedList 中的 foreach 语句是 Enumerator 的包装器。调用 foreach 将查询枚举数,调用 MoveNext 和 Current。此外,遍历通用列表可能会在遍历列表时涉及装箱和拆箱,并且可能会产生通常通过 Index 访问不会获得的性能开销。

关于.net - 在 SortedList 中循环 - 为什么这样更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658973/

相关文章:

c# - 哪些类型的异常不要捕获?

c# - 尝试在 Entity Framework 核心中添加数据库迁移时,为什么会出现 contentRootPath null 异常?

css - 使用标准数字格式字符串时的上标价格小数

.net - 当列在运行时排序时,DataGridView 行标题编号消失

docker - 使Docker容器保持事件状态并运行Java应用程序

c++ - 动态 vector 类容器,但其元素保存其索引?

.net - GDI+ 如何更改线条平滑模式?

c# - 在使用时对域对象进行更改

vb.net - 通过 HTTPS 的 wsHTTPBinding 导致错误 400 'Bad Request'

java - 自己的 String 容器与 ArrayList<String>