以下示例中的 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/