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)
为什么前两个代码块这么慢?
SortedList 通过实现 IComparer 来扩展 Collection 以提供排序功能。在内部,它实现了 2 个数组来存储列表的元素 - 一个数组用于键,另一个用于值。.NET Array 针对快速有序和快速随机访问进行了优化。
我怀疑为什么前 2 个很慢是因为 SortedList 中的 foreach 语句是 Enumerator 的包装器。调用 foreach 将查询枚举器,调用 MoveNext 和 Current。此外,遍历通用列表可能会在您遍历列表时涉及装箱和拆箱,并且可能会产生通常无法通过索引访问获得的性能开销。