【问题标题】:What is the most efficient method for looping through a SortedList in VB 2008?在 VB 2008 中遍历 SortedList 的最有效方法是什么?
【发布时间】:2009-10-29 03:01:11
【问题描述】:

下面的代码告诉我(我认为)“for each”循环比“i to n”循环快 10%,但是“for each”循环在新内存中创建了 567k?这是正确的吗?就速度和内存使用而言,哪种方式通常最有效?

如果您想在 VB 中运行此代码,只需在表单中添加一个按钮和 2 个标签。

Public Class StateObject
    Public WorkSocket As String = "FFFFFFFFFFFF"
    Public BufferSize As Integer = 32767
    Public Buffer(32767) As Byte
End Class

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For cnt As Integer = 1 To 250
        Dim StateObjecter As New StateObject
        ClientNetList.Add(cnt.ToString, StateObjecter)
    Next
End Sub


Private ClientNetList As New SortedList(Of String, StateObject)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim stop1 As New Stopwatch
    Dim stop2 As New Stopwatch

    Dim TotalMemory1 As Integer = GC.GetTotalMemory(False)
    stop1.Start()
    For cnt As Integer = 1 To 1000000
        For i = 0 To ClientNetList.Count - 1
            ClientNetList.Values(i).WorkSocket = "FFF"
        Next

    Next
    stop1.Stop()
    Dim TotalMemory2 As Integer = GC.GetTotalMemory(False)
    MsgBox(TotalMemory2 - TotalMemory1)

    TotalMemory1 = GC.GetTotalMemory(False)
    Dim fff As Integer = GC.GetGeneration(ClientNetList)
    stop2.Start()
    For cnt As Integer = 1 To 1000000
        For Each ValueType As StateObject In ClientNetList.Values
            ValueType.WorkSocket = "FFF"
        Next
    Next
    stop2.Stop()

    Dim ffff As Integer = GC.GetGeneration(ClientNetList)
    TotalMemory2 = GC.GetTotalMemory(False)
    MsgBox(TotalMemory2 - TotalMemory1)

    Label1.Text = "i: " & stop1.ElapsedMilliseconds
    Label2.Text = "e: " & stop2.ElapsedMilliseconds
End Sub

【问题讨论】:

标签: vb.net performance sortedlist


【解决方案1】:

在我的系统上,“for i = 1”循环在第一次测试(程序运行按钮的第一次单击)时快了大约 20%。但是在随后的测试中,“for each”循环要快一点。 “for each”循环占用了更多内存,但这是暂时的,最终会被垃圾回收。

这里讨论了“for each”和“for i =”的优缺点。 For each 很好,因为它适用于数组以外的结构,并使对象可用。 "for i =" 的优点是指定循环中数组项的边界和顺序,并避免了您在使用数组时可能遇到的错误:

Dim a(50) As Integer
Dim i As Integer
For Each i In a
  i = 22
  Next i

在这个例子中,数组从未初始化为 22。变量 i 只是一个数组元素的副本,当 i 被赋值为 22 时,原始数组元素不会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-07-28
    • 1970-01-01
    相关资源
    最近更新 更多