循环浏览SortedList - 为什么这会更快?

Bri*_*ter 5 .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
Run Code Online (Sandbox Code Playgroud)

 

    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
Run Code Online (Sandbox Code Playgroud)

这个在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
Run Code Online (Sandbox Code Playgroud)

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

Ash*_*h M 5

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

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