在下面的示例中,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阵列针对快速有序访问和快速随机访问进行了优化。
我怀疑为什么前两个比较慢,是因为SortedList中的foreach语句是枚举器的包装。调用foreach将查询该枚举数,调用MoveNext和Current。此外,遍历通用列表可能会涉及遍历列表时的装箱和拆箱操作,并且可能会产生通常不会通过按索引访问而获得的性能开销。
关于.net - 通过SortedList循环-为什么这样做更快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1658973/